Mam dwie tabele w MySQL. Tabela Osoba ma następujące kolumny:
id | name | fruits
fruits
Kolumna może posiadać wartość zerową lub szereg łańcuchów jak ( "KOMPUTER„ pomarańczy”,„banana”), lub („”), truskawka itp Druga tabela Tabela owoców i ma trzy kolumny:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Jak więc zaprojektować fruits
kolumnę w pierwszej tabeli, aby mogła pomieścić tablicę ciągów pobierających wartości z fruit_name
kolumny w drugiej tabeli? Ponieważ w MySQL nie ma typu danych tablicowych, jak mam to zrobić?
mysql
database-schema
tonga
źródło
źródło
Odpowiedzi:
Właściwym sposobem na to jest użycie wielu tabel i
JOIN
ich w zapytaniach.Na przykład:
person_fruit
Tabela zawiera jeden wiersz dla każdego owocu osoba jest związana z i skutecznie łączyperson
ifruits
tabel razem, IEJeśli chcesz odzyskać osobę i wszystkie jej owoce, możesz zrobić coś takiego:
źródło
person_id
ale innefruit_name
. Jest to efektywna implementacja teorii z odpowiedzi Janusa.person
stole, wszelkie informacje o owocach wfruits
stole, a także wszelkie informacje dotyczące relacji między konkretną osobą a konkretnym owocem naperson_fruit
stole. Ponieważ w tym przykładzie nie ma żadnych dodatkowych informacji,person_fruit
tabela ma tylko dwie kolumny, klucze podstawowe tabelperson
ifruits
. Ilość konkretnego owocu jest przykładem czegoś innego, co jednak mogłoby znaleźć się wperson_fruit
tabeli.INT
na kluczufruits
i mieć to tylkoINT
wperson_fruit
? Tak więc nazwę można zmienić później, a także wymagałoby mniej miejsca, jeśli nie masz o wiele więcej wierszyfruits
niż wperson_fruit
.Powodem, dla którego nie ma tablic w SQL, jest to, że większość ludzi tak naprawdę tego nie potrzebuje. Relacyjne bazy danych (dokładnie tym jest SQL) działają z wykorzystaniem relacji i przez większość czasu najlepiej jest przypisać jeden wiersz tabeli do każdego „bitu informacji”. Na przykład, jeśli możesz pomyśleć „Chciałbym tutaj uzyskać listę rzeczy”, zamiast tego utwórz nową tabelę, łącząc wiersz w jednej tabeli z wierszem w innej tabeli. [1] W ten sposób możesz przedstawić relacje M: N. Kolejną zaletą jest to, że te linki nie zaśmiecają wiersza zawierającego linkowany element. Baza danych może indeksować te wiersze. Tablice zazwyczaj nie są indeksowane.
Jeśli nie potrzebujesz relacyjnych baz danych, możesz skorzystać np. Z magazynu klucz-wartość.
Przeczytaj o normalizacji baz danych . Złota zasada brzmi: „[Każdy] element niebędący kluczem [atrybut] musi zawierać informacje o kluczu, całym kluczu i tylko o kluczu”. Tablica robi za dużo. Zawiera wiele faktów i przechowuje kolejność (która nie jest związana z samą relacją). Wydajność jest słaba (patrz wyżej).
Wyobraź sobie, że masz stolik dla osób i masz stolik z telefonami od ludzi. Teraz możesz sprawić, by każdy wiersz miał listę swoich rozmów telefonicznych. Ale każda osoba ma wiele innych związków z wieloma innymi rzeczami. Czy to oznacza, że moja tabela person powinna zawierać tablicę dla każdej rzeczy, z którą jest połączony? Nie, to nie jest atrybut samej osoby.
[1]: W porządku, jeśli tabela łącząca ma tylko dwie kolumny (klucze podstawowe z każdej tabeli)! Jeśli jednak sama relacja ma dodatkowe atrybuty, powinny one być przedstawione w tej tabeli jako kolumny.
źródło
MySQL 5.7 udostępnia teraz typ danych JSON . Ten nowy typ danych zapewnia wygodny nowy sposób przechowywania złożonych danych: list, słowników itp.
To powiedziawszy, rraye nie mapują dobrze baz danych, dlatego mapy obiektowo-relacyjne mogą być dość złożone. W przeszłości ludzie zapisywali listy / tablice w MySQL, tworząc tabelę, która je opisuje i dodając każdą wartość jako własny rekord. Tabela może mieć tylko 2 lub 3 kolumny lub może zawierać znacznie więcej. Sposób przechowywania tego typu danych w rzeczywistości zależy od właściwości danych.
Na przykład, czy lista zawiera statyczną czy dynamiczną liczbę wpisów? Czy lista pozostanie mała, czy też oczekuje się, że wzrośnie do milionów rekordów? Czy na tym stole będzie dużo czytań? Dużo pisze? Wiele aktualizacji? Są to wszystkie czynniki, które należy wziąć pod uwagę przy podejmowaniu decyzji o sposobie przechowywania zbiorów danych.
Ponadto klucz: magazyny danych wartości / magazyny dokumentów, takie jak Cassandra, MongoDB, Redis itp. Również stanowią dobre rozwiązanie. Po prostu bądź świadomy tego, gdzie dane są faktycznie przechowywane (jeśli są przechowywane na dysku lub w pamięci). Nie wszystkie dane muszą znajdować się w tej samej bazie danych. Niektóre dane nie są dobrze mapowane do relacyjnej bazy danych i możesz mieć powody do przechowywania ich w innym miejscu lub możesz chcieć użyć bazy danych klucz: wartość w pamięci jako gorącej pamięci podręcznej dla danych przechowywanych gdzieś na dysku lub jako tymczasowego magazynu na takie rzeczy jak sesje.
źródło
Warto wziąć pod uwagę, że tablice można przechowywać w Postgres.
źródło
W MySQL użyj typu JSON.
W przeciwieństwie do powyższych odpowiedzi, standard SQL zawiera typy tablic od prawie dwudziestu lat; są przydatne, nawet jeśli MySQL ich nie zaimplementował.
Jednak w twoim przykładzie prawdopodobnie będziesz chciał utworzyć trzy tabele: osoba i owoc, a następnie osoba_owoc, aby do nich dołączyć.
Jeśli chcesz skojarzyć osobę z szeregiem owoców, możesz to zrobić z widokiem:
Widok przedstawia następujące dane:
W 5.7.22 będziesz chciał użyć JSON_ARRAYAGG , zamiast hakować tablicę razem z ciągiem.
źródło
Użyj pola bazy danych typu BLOB do przechowywania tablic.
Ref: http://us.php.net/manual/en/function.serialize.php
źródło
możesz przechowywać swoją tablicę za pomocą group_Concat w ten sposób
TUTAJ przykład w skrzypcach
źródło