Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z PRIMARY/UNIQUE KEY oraz relacjami
n0zz
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.03.2015

Ostrzeżenie: (0%)
-----


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

Ten post edytował n0zz 1.03.2015, 05:33:38
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
n0zz
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.03.2015

Ostrzeżenie: (0%)
-----


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.

Ten post edytował n0zz 1.03.2015, 14:18:30
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
n0zz
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.03.2015

Ostrzeżenie: (0%)
-----


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?


Ten post edytował n0zz 1.03.2015, 15:15:36
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
n0zz
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.03.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 02:03