Mam małą bazę danych:

+-----------+-----------+------------------------+
| Name      | Number    |   Hobby                | 
+-----------+-----------+------------------------+
| Alex      | 2, 3      | Game, Shopping         |
+-----------+------------------------------------+

To średnia liczba 2 to gra i numer 3 jest zakupy. Jak mogę pokazać powyższe dane, takie jak ta tabela

+-----------+-----------+
| 2         | Game      |
+-----------+-----------+
| 3         | Shopping  |
+-----------+------------
0
Alex 1 marzec 2019, 19:55

2 odpowiedzi

Najlepsza odpowiedź

Twoja baza danych nie jest znormalizowana. Potrzebujesz trzeciego stołu, który będzie zazwyczaj nazywany tabelą dołączenia.

The people table. The primary key is id

+-----------+-----------+
| Id        | Name      |
+-----------+-----------+
| 1         | Alex      |
| 2         | Thor      |
| 3         | Iron Man  |
| 4         | Dr Stange |
| 5         | Thanos    |
+-----------+------------

The hobbies Table

+-----------+-----------+
| Id        | Name      |
+-----------+-----------+
| 1         | Game      |
| 2         | Shopping  |
| 3         | Fighting  |
+-----------+-----------+


Join table called (for example) people_hobbies

+-----------+-----------+
| person_id | hobby_id  |
+-----------+-----------+
| 1         | 1         |
| 1         | 2         |
+-----------+-----------+

Ta tabela_ -Hobbiess użyje osobistego_ID i HOBBY_ID do utworzenia klucza podstawowego multi pola. Zapewni to, że nie będziesz w stanie dodać tej samej kombinacji dwukrotnie ... co nie powinno nawet mieć sensu.

Person_id jest kluczowym kluczem, który odnosi się do identyfikatora z tabeli ludzi. Hobby_id jest kluczowym kluczem, który odnosi się do identyfikatora z tabeli hobby.

Posiadanie kluczy zagranicznych pozwoli Ci uniknąć klucza w tabeli People_Hobbies, który nie istnieje zarówno na ludziach, jak i tabeli hobby.

Przykład w poniższej tabeli pokazuje, że osoba identyfikacyjna 1 ma dwa hobby (1 i 2). Dla człowieka, który przekłada się na hobby Alexa, to gra i zakupy.

Powyższa struktura pozwoli Ci zarządzać db tak, jak robią większość ludzi.

Po prostu pamiętaj o kilka rzeczy:

  1. Nie możesz dodać niczego w ludziach_Hobbies, zanim istniały zarówno na stołach ludzi, jak i hobby
  2. Musisz mieć aktualizację kaskadową i kaskadową usunąć do definicji kluczowych zagranicznych, aby podczas usuwania osoby lub hobby z tabel usunie relację z tabeli_ -hobbies.
1
Strawberry 1 marzec 2019, 20:25
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT * FROM bad_schema;
+------+--------+----------------+
| name | number | hobby          |
+------+--------+----------------+
| Alex | 2, 3   | Game, Shopping |
+------+--------+----------------+

CREATE TABLE better_schema AS
SELECT DISTINCT name
              , SUBSTRING_INDEX(SUBSTRING_INDEX(number,',',i+1),',',-1) + 0 number
              , TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(hobby,',',i+1),',',-1)) hobby
           FROM bad_schema
              , ints;


SELECT * FROM better_schema;
+------+--------+----------+
| name | number | hobby    |
+------+--------+----------+
| Alex |      2 | Game     |
| Alex |      3 | Shopping |
+------+--------+----------+
0
Strawberry 1 marzec 2019, 17:06