Jak "navrhnout" tabulku pro MySQL

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod CZechBoY » 24 dub 2014 19:57

Našel jsem něco na stackoverflow

Kód: Vybrat vše

CREATE TABLE user_tweets (
  id INT NOT NULL AUTO_INCREMENT,
  id_user INT NOT NULL,
  id_tweet INT NOT NULL,
  PRIMARY KEY(id),
  FOREIGN KEY (id_tweet)
    REFERENCES tweets(tweeth_id)
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  FOREIGN KEY (id_user)
    REFERENCES users(user_id)) ENGINE=INNODB;

CREATE TABLE followers (
  id_user INT NOT NULL REFERENCES users (user_id),
  id_following INT NOT NULL REFERENCES users (user_id),
  PRIMARY KEY (id_user, id_following)
) ENGINE=INNODB;
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Reklama
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: říjen 11
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod honzaik » 24 dub 2014 20:30

to tam má ještě nejakou jinou tabulku tweets atd. radši to nechám jak to bylo viz

Kód: Vybrat vše

CREATE TABLE `following` (
   `followId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `follower` INT(10) UNSIGNED NOT NULL,
   `follows` INT(10) UNSIGNED NOT NULL,
   PRIMARY KEY (`followId`),
   INDEX `follower` (`follower`),
   INDEX `follows` (`follows`),
   CONSTRAINT `follower` FOREIGN KEY (`follower`) REFERENCES `users` (`userId`) ON UPDATE CASCADE ON DELETE CASCADE,
   CONSTRAINT `follows` FOREIGN KEY (`follows`) REFERENCES `users` (`userId`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

ello dere

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod CZechBoY » 24 dub 2014 20:43

followId je k ničemu...
Co ti nejde na tom mým řešení?
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: říjen 11
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod honzaik » 24 dub 2014 22:00

nepotřebuju tabulku user_tweets a "REFERENCES users (user_id)," přece neudělá foreign key jen tak. jako bud mit primarní key na follower a follows. a kvůli tomu že chci foreign key budu muset mit na jednom ještě speciální klíč pro 2. referenci. takže vlastně 2 sloupce a na 1 z nich 2 indexy. nemůžu mit na tom primarnim klici 2 reference ke jednomu sloupci. tak nevim co je lepší
ello dere

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod CZechBoY » 24 dub 2014 22:06

No a tne můj kod ti nejde? Tam je přece tabulka jen s 2 sloupcema.
Ty ten 3. sloupec nepotřebuješ, tak nevim proč ho tam dáváš :-)
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: říjen 11
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod honzaik » 24 dub 2014 22:19

tohle?

Kód: Vybrat vše

CREATE TABLE followers (
  id_user INT NOT NULL REFERENCES users (user_id),
  id_following INT NOT NULL REFERENCES users (user_id),
  PRIMARY KEY (id_user, id_following)
) ENGINE=INNODB;

vznikne mi sice tabulka o 2 sloupcích na kterejch je primary key ale žádná reference k tabulce users (když jsem dobře přepsal názvy sloupců samožejmě :D doufám). když se na to podívám třeba v HeidiSQL tak to tam ukazuje jen primary key, žádná relace k jiným tabulkám - ani to že smažu z tabulky user usera s id 1 tak to nesmaže nic v tabulce followers s tim jeho id - prostě jakoby tam "REFERENCES users xxx" nic nedělalo
ello dere

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod CZechBoY » 24 dub 2014 22:24

No a teď přidáš 2 cizí klíče do tý tabulky eště... samozřejmě že bez cizích klíčů ti to nebude mazat :D
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: říjen 11
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod honzaik » 24 dub 2014 22:37

takže budu mit celkem 4 klíče a z toho 2 na každym sloupci, žejo? jako nechci bejt naivní a myslet si že tam bude tolik řádků ale, nebude to nějak zpomalovat tu databázi (INSERT, DELETE), nebo prostě výkonově lepší mít 3 sloupce a na každym klíč? nebo to je prostě jen tupá mikrooptimalizace?
ello dere

omilis
Level 1.5
Level 1.5
Příspěvky: 118
Registrován: červenec 09
Pohlaví: Muž
Stav:
Offline

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod omilis » 24 dub 2014 23:01

Jak píše CZechBoy, tohle by mělo fungovat (nejsem si úplně jistý, už jsem databáze dlouho nedělal)

Kód: Vybrat vše

CREATE TABLE followers (
  id_user INT NOT NULL REFERENCES users (user_id) ON DELETE CASCADE,
  id_following INT NOT NULL REFERENCES users (user_id)ON DELETE CASCADE,
  PRIMARY KEY (id_user, id_following)
);


References vytváří cízí klíč automaticky.

Pak přidáš index a id_following a máš hotovo. Určitě se jedná o přehlednější a výkonější řešení.

EDIT:
Kdyby ti nefungovaly ty REFERENCES, tak pak takhle

Kód: Vybrat vše

CREATE TABLE `following` (
   `follower` INT(10) UNSIGNED NOT NULL,
   `follows` INT(10) UNSIGNED NOT NULL,
   PRIMARY KEY (`follower`,`follows`),
   INDEX `follows` (`follows`),
   CONSTRAINT `follower` FOREIGN KEY (`follower`) REFERENCES `users` (`userId`) ON UPDATE CASCADE ON DELETE CASCADE,
   CONSTRAINT `follows` FOREIGN KEY (`follows`) REFERENCES `users` (`userId`) ON UPDATE CASCADE ON DELETE CASCADE
)

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod CZechBoY » 25 dub 2014 12:36

Já uvádím jen 2 klíče, nevim kde ty máš 4 klíče...
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: říjen 11
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak "navrhnout" tabulku pro MySQL

Příspěvekod honzaik » 25 dub 2014 15:47

no spletl jsem. bral jsem foreign key jako část tabulky (takže +1 klíč). stejne to nějak nevycházelo :D díky omilis, neco takovýho jsem měl, ted jsem si uvedomil že to je teda správně :D a lepší. díky czechboy, něco novému jsem se přiučil :D
ello dere


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti