sql >> Databáze >  >> RDS >> Mysql

Ukládání csv v poli MySQL – špatný nápad?

Nechcete ukládat hodnotu ve formě oddělené čárkami.

Zvažte případ, kdy se rozhodnete spojit tento sloupec s jinou tabulkou.

Zvažte, že ano,

x  items
1  1, 2, 3
1  1, 4
2  1

a chcete najít odlišné hodnoty pro každé x, tj.:

x  items
1  1, 2, 3, 4
2  1

nebo možná budete chtít zkontrolovat, zda obsahuje 3

nebo je možná budete chtít převést do samostatných řádků:

x  items
1  1
1  2
1  3
1  1
1  4
2  1

Bude to VELKÁ BOLEST.

Použijte alespoň 1. princip normalizace – pro každou hodnotu mějte samostatný řádek.

Nyní řekněte, že jste původně měli na stole toto:

x  item
1  1
1  2
1  3
1  1
1  4
2  1

Můžete jej snadno převést na hodnoty csv:

select x, group_concat(item order by item) items
from t
group by x

Pokud chcete vyhledat, zda x =1 má položku 3. Snadno.

select * from t where x = 1 and item = 3

což by v dřívějším případě znamenalo strašný find_in_set :

select * from t where x = 1 and find_in_set(3, items);

Pokud si myslíte, že můžete použít jako s hodnotami CSV k vyhledávání, pak nejprve like %x% nelze použít indexy. Za druhé to povede k nesprávným výsledkům.
Řekněme, že chcete zkontrolovat, zda je přítomna položka ab, a uděláte %ab% vrátí řádky s abc abcd abcde .... .

Pokud máte mnoho uživatelů a položek, pak bych navrhoval vytvořit samostatnou tabulku users s PK userid, další items s PK itemid a nakonec mapovací tabulkou user_item se sloupci userid, itemid.

Pokud víte, že budete muset tyto hodnoty pouze uložit a načíst a nebudete s nimi provádět žádné operace, jako je spojení, vyhledávání, odlišení, převod na samostatné řádky atd. atd. – může být jen může být, můžete (stále bych rád 't).



  1. Google Maps Uložit polygon a body v MySQL pomocí PHP

  2. Nelze se připojit:Ztratilo se připojení k serveru MySQL při „čtení počátečního komunikačního paketu“, systémová chyba:0

  3. Problém s pamětí SQLite s přístupem singleton

  4. Zálohy databáze – porovnání MariaDB Mariabackup a Percona Xtrabackup