Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z PRIMARY/UNIQUE KEY oraz relacjami
Forum PHP.pl > Forum > Bazy danych > MySQL
n0zz
Hej!
Otóż mam taki problem, a raczej kilka...
Staram się stworzyć bazę na podstawie 2 tabel.

  1. CREATE TABLE IF NOT EXISTS `commands` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `channel` varchar(30) NOT NULL,
  4. `command` varchar(30) NOT NULL,
  5. `text` varchar(255) NOT NULL,
  6. PRIMARY KEY (`id`) -- ??
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
  8.  
  9. CREATE TABLE IF NOT EXISTS `users` (
  10. `id` int(11) NOT NULL AUTO_INCREMENT,
  11. `channel` varchar(30) NOT NULL,
  12. `premium` BOOLEAN NOT NULL DEFAULT 0
  13. PRIMARY KEY (`id`) -- ??
  14. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;


Niby wszystko ładnie pięknie, ale schody zaczynają się kiedy kombinuję z relacjami w tych 2 tabelach.
Chciał bym utworzyć relację między tymi tabelami po przez 'channel'.
W zasadzie, to nawet tych pól 'id' nie potrzebuje, chyba. Sam już nie wiem.
Próbowałem ustawiac primary/unique keye na id i na channel w róznych konfiguracjach. Zawsze napotykam jakieś problemy, błędy...
Albo nie da się ustawić relacji na channel, tylko na id. Albo nie da się dodawać danych do bazy, a relacje da się ustawić i na id i na channel. Albo jakies inne problemy, typu nie da się ustawić opcji primary key w którejś tabeli...

Jednym słowem...
Chcę relacji między tabelami poprzez channel.
commands.id, users.id i users.channel mają być unikalne.

Ktoś podrzuci jakieś konkretne, gotowe rozwiązanie na te 2 tabele? Bo już nie mam do tego siły na ten moment, no i nie chce mi się przerabiać całego sql'a od 0 żeby to ogarnąć w całości.
Wersja MySQL: 5.5.41
Pyton_000
A możesz wyjaśnić dlaczego chcesz tworzyć relację po "chanel" ?
Jakie jest logiczne powiązanie pomiędzy tymi tabelami bo nie potrafię wymyślić logicznego powiązania pomiędzy user-command i kolumnie chanel. Dla mnie chanel to jest kolumna oderwana od całości.
n0zz
Jak by to wyjaśnić...
Channel w tabeli users jest nazwą użytkownika. W sumie mogło by tam nie być w ogóle id chyba, ale bez id i ustawionego primary key na id w phpmyadminie jakieś tam komunikaty wyskakiwały.
Channel w tabeli commands to kanał czatu na którym działają te określone komendy które są w bazie właśnie przypisane do tego kanału(który jest jednocześnie użytkownikiem).

Także, users.channel jest jednocześnie użytkownikiem, który może kupić premium lub nie, oraz nazwą kanału(commands.channel) na którym mają być używane komendy.
W zasadzie, jak tak sobie myślę to nawet nie jestem pewny po co są te relacje w ogóle. Także liczę na pomoc w stworzeniu tej prostej bazy. Jakieś wytłumaczenie co, jak i po co, albo link, do czegoś, co wyjaśni mi wszystko w prosty sposób. Ale żebym nie musiał przerabiać przykładowo książki 400 stron na temat sql'a... Bo tym może się zajmę za jakiś czas, teraz chcę doprowadzić projekt do sensownego etapu i brakuje mi sumie tylko tej bazy, w miarę zorganizowanej.
Pyton_000
tabele:
- users (id, name, premium)
- channels (id, name)
- commands (id, command, description)
- channel_command (chanel_id, command_id) - Jakie komendy dla jakiego kanału
- channel_user (user_id, channel_id) - Jakie komendy dla jakiego użytkownika

Teraz ustalenie relacji nie jest problemem a i większe możliwości bo:
- Komendy ustalasz raz
- Kanały ustalasz raz
- wiele użytkowników może mieć tą samą komendę
- Wiele kanałów może mieć tą samą komendę

Tak więc może nie jest to 2 table ale masz możliwość ustalenia bardziej logicznych relacji.
n0zz
Nie rozumiem po co mają być jednocześnie te dwie tabele:
Cytat
- users (id, name, premium)
- channels (id, name)


No i skoro tak, to te dwie również:
Cytat
- channel_command (chanel_id, command_id) - Jakie komendy dla jakiego kanału
- channel_user (user_id, channel_id) - Jakie komendy dla jakiego użytkownika


W users i channels będą dokładnie te same dane, user to jednocześnie channel...
Każdy user ma dokładnie 1 channel którego nazwa jest jednocześnie nazwą tego użytkownika. Nie rozumiem po co to rozdzielać na 5 tabel, skoro wystarczyły by 2, lub 3(zakładając, że relacje stworzył bym w 3 tabeli, podobnej do tej channel_command).

No i nawet jeśli bym się brał za ustawianie takich tabel, to wychodzi na to, że znów bym miał problem z tymi kluczami przy ustawianiu relacji.


Może tak. Nie rozdzielając już kompletnie na to user i channel, bo to jedno i to samo...
users(id, name, premium)
commands(id, name, command, description)

Lub:
users(id, name, premium)
commands(id, command, description)
user_command(user_id, command_id)

To by miało sens?
Pyton_000
Skoro jest założenie że user == channel to Twoja propozycja 2 jest dobra.
Zauważ że w takim przypadku 1 command możesz przypisać dla kilku userów. Chyyyba że 1 command ma być tylko dla jednego usera to 1-sza propozycja i PK na id oraz foreign_key po ID
n0zz
Dobra, na razie zabrałem się do roboty na szybko posiadając tylko tabelę commands.
Dzisiaj już nic nie robię, bo spać trzeba lecieć. Ale sprawdzę jutro jak to będzie z tymi kluczami w końcu... Mam nadzieję, że dam ratę to ogarnąć...
No i przy okazji, już wiem, że będzie w tej bazie dużo więcej tabel tongue.gif
Przynajmniej ze 4 jeszcze. A przy dobrej organizacji, żeby się to nie mieszało to pewnie ze 2x tyle...
Chyba jednak przysiądę na parę dni/tygodni do tego sql'a żeby to ogarnąć, bo nie mam nikogo od tego, a będzie potrzebnych parę rzeczy :/

W każdym razie, dzięki za rady smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.