sql >> Database teknologi >  >> RDS >> Oracle

databasedesign en-til-mange-til-mange

Du bør altid starte med at designe dine tabeller i tredje normalform (3NF). Det er helt acceptabelt at vende tilbage til mindre former (normalt af præstationsmæssige årsager), forudsat at du forstår og afbøder virkningen, men start med 3NF.

Den (lidt forenklede) regel at huske er, at hver ikke-nøglekolonne i en tabel skal afhænge af:

  • nøglen,
  • hele nøglen,
  • og intet andet end nøglen,
  • "så hjælp mig, Codd" - lidt DBA-humor (og jeg mener "lidt").

Det første spørgsmål er ret simpelt.

En-til-mange-relationer er bedst repræsenteret som en fremmednøgle i "mange"-tabellen. Så det du foreslår er fornuftigt. Det giver dig mulighed for at begrænse forholdet automatisk. Hvis du havde et separat sammenføjningsbord (brugt til mange-til-mange), ville du skulle ty til "tricky" for at håndhæve en-til-mange-forholdet.

Med hensyn til dit andet spørgsmål, skal du se på "Codd"-reglen ovenfor og tænke for dig selv:hvad repræsenterer disse rækker i hver tabel? Hvis en arbejdselementhandling er et forskelligt objekt fra et arbejdselement (de kan være relaterede men hvis de ikke repræsenterer det samme objekt, er de forskellige), bør de være i forskellige tabeller.

Derudover ser det ud til, at du har et en-til-mange forhold der (et element kan have mange handlinger), så de burde være i forskellige tabeller alene af den grund.

Med hensyn til din forespørgsel om de overflødige oplysninger:hvis de virkelig er overflødige, bør de repareres.

Ved at bruge step_num som et eksempel, hvad repræsenterer dette præcist? Hvis det er en egenskab for arbejdet, det burde ikke være i arbejdet bord overhovedet.

Du ville slippe af med det derfra, og hvis du ville vide trinnummeret for en række i arbejdshandlingstabellen, ville du slutte dig til arbejdsemnetabellen ved hjælp af fremmednøglen.

Hvis det i stedet er en egenskab for arbejdshandlingen, bør du fjerne det fra arbejdsemnetabellen, da det ikke giver nogen mening. Du har måske to handlinger med hver sit trinnummer, så hvad ville trinnummeret på det overordnede element være i så fald?

Selvfølgelig kan du have en særlig trinnummer for både elementer og handlinger - i så fald ville jeg overveje at omdøbe for at tydeliggøre hensigten, noget som item_step_num og action_step_num .

Bundlinjen er at starte med 3NF. Hvis din database på et tidspunkt kører for langsomt, overveje tilbagevenden til en mindre form. Du kan derefter spørge en anden spørgsmål her om, hvordan man genkender og afhjælper de problemer, der opstår deraf (f.eks. muligheden for inkonsistente data to steder, og brug af triggere til at forhindre det).




  1. Hent mere end 3 data fra mysql ind i afkrydsningsfeltet

  2. Oracle PL/SQL:Loop over triggerkolonner dynamisk

  3. PHP MySQL-søgning med flere kriterier

  4. Græsk tekst vises ikke korrekt