sql >> Database >  >> RDS >> PostgreSQL

Zijn er opties voor een join-tafel voor veel-op-veel verenigingen?

  • Als modellen geen kleurgroepen delen, zou het ontwerp één tabel zijn:

    model [model] comes in color [color]
    
  • Als modellen kleurgroepen delen, hebben ze twee tabellen:

    model [model] comes in the colors of group [group]
    group [group] has color [color]
    

    Deze tabellen voegen zich met projectie bij de eerste tafel:

    SELECT model, color FROM model_group NATURAL JOIN group_color
    
  • Als een model naast of in plaats van een groep uitzonderlijke beschikbare en/of niet-beschikbare kleuren kan hebben, gebruik dan uitzonderingstabellen. De groep van een tafel is nu de standaard kleuren (indien aanwezig):

    model [model] has default color group [group]
    group [group] has color [color]
    model [model] is exceptionally available in color [color]
    model [model] is exceptionally unavailable in color [color]
    

    De uitzonderingstabellen worden dan respectievelijk UNIONed met en MINUSed/EXCEPTed van een JOIN-plus-PROJECT/SELECT om de eerste tabel te geven:

    SELECT group, color FROM model_default NATURAL JOIN group_colour
    EXCEPT SELECT * FROM model_unavailable
    UNION SELECT * FROM model_available
    

"Redundantie" gaat niet over waarden die op meerdere plaatsen verschijnen. Het gaat om meerdere rijen die hetzelfde over de applicatie vermelden.

Elke tabel (en query-expressie) heeft een bijbehorende invul-in-de-(named-)blanks-instructiesjabloon (ook wel predikaat genoemd). De rijen die een waar statement maken, komen in de tabel. Als je twee onafhankelijke predikaten hebt, heb je twee tabellen nodig. De relevante waarden komen in de rijen van elk.

Re rijen die uitspraken doen over de applicatie zien dit. (En zoek in mijn andere antwoorden naar de "verklaring" of het "criterium" van een tabel.) Normalisatie helpt omdat het tabellen vervangt waarvan de rijen dingen van de vorm "... EN ..." aangeven door andere tabellen die de "... " afzonderlijk. Zie dit en dit.

Als u groepen deelt en slechts één tabel met twee kolommen gebruikt voor model en kleur, is het predikaat:

FOR SOME group
    model [model] comes in the colors of group [group]
AND group [group] has color [color]

Dus het tweede opsommingsteken verwijdert een enkele "EN" uit dit predikaat, dwz de bron van een "meerwaardige afhankelijkheid". Als u anders de groep van een model of de kleuren van een groep wijzigt, moet u tegelijkertijd consequent meerdere rijen wijzigen. (Het gaat erom fouten en complexiteit door redundantie te verminderen, niet om ruimte te besparen.)

Als je de strings niet wilt herhalen voor implementatie(-afhankelijke) redenen (ruimte ingenomen of snelheid van bewerkingen ten koste van meer joins) voeg dan een tabel met naam-id's en strings toe en vervang uw oude naamkolommen en -waarden door id-kolommen en -waarden. (Dat is geen normalisatie, dat bemoeilijkt uw schema omwille van implementatieafhankelijke afwegingen voor gegevensoptimalisatie. En u zou moeten demonstreren dit is nodig en werkt.)



  1. Londiste-replicatie met PostgreSQL 9.0

  2. CURTIME() Voorbeelden – MySQL

  3. Hoe kan ik bigint (UNIX-tijdstempel) converteren naar datetime in SQL Server?

  4. gem install pg werkt niet op OSX Lion