sql >> Databáze >  >> RDS >> Sqlserver

SQL:Normalizace databáze při zachování omezení

Implementujete Entity-Attribute-Value antivzorec. Toto nemůže být návrh normalizované databáze, protože není relační.

Místo toho bych navrhl dědění tabulky tříd návrhový vzor:

  • Vytvořte jednu tabulku pro organismy, která bude obsahovat vlastnosti společné všem druhům.
  • Vytvořte jednu tabulku pro každý druh obsahující vlastnosti specifické pro daný druh. Každá z těchto tabulek má vztah 1:1 s organismy, ale každá vlastnost patří do vlastního sloupce.

     ____________________             ____________________
    |     Organisms      |           |       Species      |
    |--------------------|           |--------------------|
    |OrganismId (int, PK)|           |SpeciesId (int, PK) |
    |SpeciesId (int, FK) |∞---------1|Name (varchar)      |
    |Name (varchar)      |           |____________________|
    |____________________|
              1
              |
              |
              1
     ______________________ 
    |    HumanOrganism     |
    |----------------------|
    |OrganismId (int, FK)  |
    |Sex      (enum)       |
    |Race     (int, FK)    |
    |EyeColor (int, FK)    |
    |....                  |
    |______________________|
    

To sice znamená, že vytvoříte mnoho tabulek, ale považujte to za kompromis s mnoha praktickými výhodami ukládání vlastností relativně správným způsobem:

  • Můžete vhodně použít datové typy SQL, místo abyste vše považovali za volně tvarovaný varchar.
  • Můžete použít omezení nebo vyhledávací tabulky k omezení určitých vlastností pomocí předem definované sady hodnot.
  • Vlastnosti můžete nastavit jako povinné (tj. NENULL) nebo použít jiná omezení.
  • Data a indexy se ukládají efektivněji.
  • Dotazy se snáze píší a RDBMS snáze spouští.

Další informace o tomto návrhu najdete v knize Martina Fowlera Patterns of Enterprise Application Architecture , nebo moje prezentace Praktické objektově orientované modely v SQL , nebo moje kniha, SQL Antipatterns:Vyhýbání se nástrahám databázového programování .



  1. Proč se data, která nahraji, přejmenují a odpovídající data se přidají do jiných řádků?

  2. Jak provést 2 nebo více SQL dotazů v PHP bez spojování tabulek

  3. Co jsou uživatelská oprávnění databáze?

  4. Načíst počet aktualizovaných řádků