[MySQL] Probleem met create table

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • mu-sick
  • Registratie: September 2005
  • Laatst online: 04-07-2024
Hey iedereen,

Voor een opdracht moet ik systeem maken waarin je links (bookmarks) kan toevoegen aan bepaalde categoriën, zoeken en bekijken etc. Hierbij moet ik gebruiken maken van php en sql
Dus ik heb een database nodig, daarom heb ik in visio de ERD gemaakt. Het probleem waarmee ik zit is dat visio andere benamingen heeft voor de sql datatypen. Aangezien mijn kennis van sql alleen de basis is (queries uitvoeren vooral) weet ik niet de goede datatypen. Ik heb een poging gedaan (zie hieronder) aan de hand van google. Mijn vraag is, komt de query beneden die tabellen aanmaakt overeen met de in de plaatjes beschreven tabellen/datatypen, en klopt de relatie tussen de tabellen? (ik heb een paar verwijzende sleutels in de tabellen, zie de ERD > FK is verwijzende sleutel). Alvast bedankt

De database ERD
Afbeeldingslocatie: http://home.online.nl/emarsnijboer/database_erd.jpg

Tabel Admin
Afbeeldingslocatie: http://home.online.nl/emarsnijboer/tabel_admin.jpg

Tabel Bookmarks
Afbeeldingslocatie: http://home.online.nl/emarsnijboer/tabel_bookmarks.jpg

Tabel Categories
Afbeeldingslocatie: http://home.online.nl/emarsnijboer/tabel_categories.jpg

Tabel Tags
Afbeeldingslocatie: http://home.online.nl/emarsnijboer/tabel_tags.jpg

De sql queries

SQL: sql.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE TABLE `admin` (
        `admin_id` TINYINT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT,
        `admin_naam` VARCHAR( 10 ) NOT NULL,
        `admin_wachtwoord` VARCHAR( 10 ) DEFAULT 0 NOT NULL,
        PRIMARY KEY ( `admin_id` )
       )'

CREATE TABLE `bookmarks` (
        `bookmark_id` TINYINT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT,
        `bookmark_link` VARCHAR( 255 ) NOT NULL,
        `bookmark_omschrijving` VARCHAR( 170 ) NOT NULL,
        `categorie` VARCHAR( 170 ) NOT NULL,
        PRIMARY KEY ( `bookmark_id` )
       )'

CREATE TABLE `tags` (
        `tag_id` TINYINT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT,
        `tag` VARCHAR( 50 ) NOT NULL,
        `bookmark_id` VARCHAR( 10 ) NOT NULL,
        PRIMARY KEY ( `tag_id` )
       )'

CREATE TABLE `categories` (
        `categorie` VARCHAR( 20 ) UNSIGNED NOT NULL,
        PRIMARY KEY ( `categorie` )
       )'

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
>> ik heb een paar verwijzende sleutels in de tabellen, zie de ERD > FK is verwijzende sleutel
Die zie ik niet terug in je SQL-queries, jij wel?

Zijn een admin_naam, tag en bookmark_link niet uniek?

Acties:
  • 0 Henk 'm!

  • mu-sick
  • Registratie: September 2005
  • Laatst online: 04-07-2024
GlowMouse schreef op zaterdag 03 oktober 2009 @ 20:47:
>> ik heb een paar verwijzende sleutels in de tabellen, zie de ERD > FK is verwijzende sleutel
Die zie ik niet terug in je SQL-queries, jij wel?

Zijn een admin_naam, tag en bookmark_link niet uniek?
nee, daarvoor heb ik admid_id, tag_id en bookmark id. admin_naam en bookmark_link zou wel handig zijn als ze uniek zijn inderdaad. Echter zou ik niet weten hoe je dat zou moeten aangeven in sql.

Acties:
  • 0 Henk 'm!

  • mu-sick
  • Registratie: September 2005
  • Laatst online: 04-07-2024
Na nog een uur stoeien in phpmyadmin kom ik op de volgende code

SQL: sql.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE TABLE IF NOT EXISTS `admin` (
  `admin_id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `admin_naam` varchar(10) NOT NULL,
  `admin_wachtwoord` varchar(10) NOT NULL,
  PRIMARY KEY (`admin_id`),
  UNIQUE KEY `admin_naam` (`admin_naam`)
)

CREATE TABLE IF NOT EXISTS `bookmarks` (
  `bookmark_id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `bookmark_link` varchar(255) DEFAULT NULL,
  `bookmark_omschrijving` varchar(170) DEFAULT NULL,
  `categorie` varchar(170) DEFAULT NULL,
  PRIMARY KEY (`bookmark_id`)
)

CREATE TABLE IF NOT EXISTS `categories` (
  `categorie` varchar(20) NOT NULL DEFAULT '',
  PRIMARY KEY (`categorie`),
  UNIQUE KEY `categorie` (`categorie`)
)

CREATE TABLE IF NOT EXISTS `tags` (
  `tag_id` tinyint(6) NOT NULL AUTO_INCREMENT,
  `tag` varchar(50) DEFAULT NULL,
  `bookmark_id` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`tag_id`),
  UNIQUE KEY `tag_id` (`tag_id`),
  UNIQUE KEY `tag` (`tag`)
)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
PK's zijn al uniek. En wil je nou nog foreign keys hebben?

[ Voor 50% gewijzigd door GlowMouse op 03-10-2009 22:02 ]


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Hier even kijken? Dit is allemaal zeker wel te vinden via Google zeker icm MySql.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • mu-sick
  • Registratie: September 2005
  • Laatst online: 04-07-2024
GlowMouse schreef op zaterdag 03 oktober 2009 @ 22:02:
PK's zijn al uniek. En wil je nou nog foreign keys hebben?
Ja, 'categorie' in de tabel bookmarks komt vanuit de tabel categories en 'bookmark_id' in de tabel tags komt vannuit de tabel bookmarks.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Zie de handleiding, staat keurig in uitgelegd hoe je in MySQL met de innoDB-engine FK-constraints kan aanmaken.

Waarom gebruik je trouwens tinyint's als datatype voor de id's? Weet je heel zeker dat je binnen de kortste keren in de problemen wilt komen? Je kunt dan maximaal 255 keer een record aanmaken, daarna is het over met de pret. Gebruik gewoon een INT, dan kom je de komende jaren niet in de problemen. Dat kleine beetje extra geheugengebruik voel je niets van.

En waarom heeft de tabel "categories" geen id? Het is niet verplicht, maar wel handig en consequent: Je doet dit in de andere tabellen tenslotte ook.

Acties:
  • 0 Henk 'm!

  • mu-sick
  • Registratie: September 2005
  • Laatst online: 04-07-2024
cariolive23 schreef op zondag 04 oktober 2009 @ 08:51:
Zie de handleiding, staat keurig in uitgelegd hoe je in MySQL met de innoDB-engine FK-constraints kan aanmaken.

Waarom gebruik je trouwens tinyint's als datatype voor de id's? Weet je heel zeker dat je binnen de kortste keren in de problemen wilt komen? Je kunt dan maximaal 255 keer een record aanmaken, daarna is het over met de pret. Gebruik gewoon een INT, dan kom je de komende jaren niet in de problemen. Dat kleine beetje extra geheugengebruik voel je niets van.

En waarom heeft de tabel "categories" geen id? Het is niet verplicht, maar wel handig en consequent: Je doet dit in de andere tabellen tenslotte ook.
Over dat tinyint had ik nog niet nagedacht, goed punt.
Categories heeft geen id tabel omdat catagorie zelf al een unieke waarde moet zijn, en zoveel categorieën zullen er niet komen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
mu-sick schreef op zondag 04 oktober 2009 @ 22:12:
[...]


Categories heeft geen id tabel omdat catagorie zelf al een unieke waarde moet zijn, en zoveel categorieën zullen er niet komen.
En waarom gold dat niet voor tags en admin_naam?

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 17-09 16:59

Johnny

ondergewaardeerde internetguru

cariolive23 schreef op zondag 04 oktober 2009 @ 08:51:
Waarom gebruik je trouwens tinyint's als datatype voor de id's? Weet je heel zeker dat je binnen de kortste keren in de problemen wilt komen? Je kunt dan maximaal 255 keer een record aanmaken, daarna is het over met de pret. Gebruik gewoon een INT, dan kom je de komende jaren niet in de problemen. Dat kleine beetje extra geheugengebruik voel je niets van.
Maak er ook meteen een INT UNSIGNED van, want negatieve getallen (SIGNED is standaard) gebruik je ook niet omdat de AUTO_INCREMENT begint met 1. Dit was wel zo in de eerste query, maar later is het weer weggehaald.

Verder is 10 maximaal karakters voor een naam, en wachtwoord wel erg weinig. Over het algemeen is het ook niet aan te raden om wachtwoorden direct in de database op te slaan, afhankelijk van je applicatie moet je eens kijken hoe je deze kan encoden of hashen.

De manier om in de kolomnaam nog een keer je tabelnaam te herhalen (en ook nog een in het commentaar) is niet erg DRY (Don't Repeat Yourself). Als je onderscheid wilt maken tussen tabellen kun je gewoon tabelenaam.kolomnaam doen in je queries. De combinatie van Engels en Nederlands is ook iets wat je niet altijd in dank zal worden afgenomen, doe het gewoon allemaal in het Engels. Het is ook een goede gewoonte om enkelvoud te gebruiken voor je tabelnamen (zoals je nu al doet bij admin).

[ Voor 41% gewijzigd door Johnny op 04-10-2009 23:21 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Johnny schreef op zondag 04 oktober 2009 @ 23:09:Het is ook een goede gewoonte om enkelvoud te gebruiken voor je tabelnamen (zoals je nu al doet bij admin).
Ik zou toch zweren dat het gebruik van meervoud voor de tabelnamen de goede gewoonte is, er staan tenslotte meerdere records in één tabel.

Wanneer je hier op gaat googleen, dan zul je ontdekken dat er twee kampen zijn: enkelvoud en meervoud. Beide zijn goed en beide zijn fout, het ligt er maar net aan wie je om een mening vraagt.
Pagina: 1