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

Rozdíl mezi strukturou dvou tabulek

Antivzor?

V běžném případě je druhá tabulka anti-pattern v kontextu návrhu databáze. A co víc, má konkrétní název:Entity-Attribute-Value (EAV). Jsou případy, kdy je použití tohoto designu oprávněné, ale to jsou vzácné případy – a i tam se tomu lze vyhnout.


Proč je EAV špatná

Podpora integrity dat

Navzdory skutečnosti, že se taková struktura zdá být „flexibilnější“ nebo „pokročilejší“, má tento design slabinu.

  • Nelze nastavit povinné atributy . Nemůžete nastavit některý atribut jako povinný, protože atribut je nyní uložen jako řádek – a jediným znakem toho, že atribut není nastaven – je, že v tabulce chybí odpovídající řádek. SQL vám nedovolí vytvořit takové omezení nativně – takže to budete muset zkontrolovat v aplikaci – a ano, pokaždé se dotazovat na tabulku
  • Míchání typů dat . Nebudete moci používat standardní datové typy SQL. Protože váš sloupec s hodnotami musí být „supertyp“ pro všechny uložené hodnoty v něm. To znamená - obecně budete muset ukládat všechna data jako raw řetězce . Pak uvidíte, jak bolestivé je pracovat s daty jako s řetězci, pokaždé přehazovat datové typy, kontrolovat integritu dat atd.
  • Nelze prosadit referenční neporušenost . V normální situaci můžete použít cizí klíč k omezení vašich hodnot těmi, které jsou definovány v nadřazené tabulce. Ale ne v tomto případě - je to proto, že referenční integrita je aplikována na každý řádek v tabulce, ale ne na hodnoty řádků. Takže – o tuto výhodu přijdete – a to je jedna ze základních ve vztahu DB
  • Nelze nastavit názvy atributů . To znamená - nemůžete správně omezit název atributu na úrovni DB. Například napíšete "customer_name" jako název atributu v prvním případě – a další vývojář to zapomene a použije "name_of_customer" . A.. to je v pořádku, DB to projde a skončíte s hodinami strávenými laděním tohoto případu.

Rekonstrukce řady

Navíc rekonstrukce řady bude v běžném případě hrozná. Pokud máte například 5 atributů – to bude 5 samotabulkových JOIN -s. Škoda tak jednoduchého - na první pohled - případu. Nechci si tedy ani představovat, jak budete udržovat 20 atributů.


Lze to odůvodnit?

Jde mi o to - ne. V RDBMS bude vždy existovat způsob, jak se tomu vyhnout. Je to strašné. A pokud je zamýšleno použití EAV, pak může být nejlepší volbou nerelační databáze.



  1. Formátování pole PHP pro klauzuli SQL IN

  2. SQL více sloupců v klauzuli IN

  3. MySQL - Trvalé připojení vs sdružování připojení

  4. Jak zakázat volbu only_full_group_by v Laravelu