sql >> Database >  >> RDS >> Oracle

databaseontwerp één-op-veel-op-veel

U moet altijd beginnen met het ontwerpen van uw tabellen in de derde normaalvorm (3NF). Het is heel acceptabel om terug te keren naar mindere vormen (meestal om prestatieredenen) op voorwaarde dat u de impact begrijpt en beperkt, maar begin met 3NF.

De (enigszins vereenvoudigde) regel om te onthouden is dat elke niet-sleutelkolom in een tabel afhankelijk moet zijn van:

  • de sleutel,
  • de hele sleutel,
  • en niets anders dan de sleutel,
  • "dus help me, Codd" - een beetje DBA-humor (en ik bedoel echt "weinig").

De eerste vraag is vrij eenvoudig.

Een-op-veel-relaties worden het best weergegeven als een externe sleutel in de "veel"-tabel. Dus wat je voorstelt is verstandig. Hiermee kunt u de relatie automatisch beperken. Als u een aparte samenvoegtabel had (gebruikt voor veel-op-veel), zou u uw toevlucht moeten nemen tot "bedrog" om de een-op-veel-relatie af te dwingen.

Wat uw tweede vraag betreft, moet u naar de bovenstaande "Codd"-regel kijken en bij uzelf denken:wat vertegenwoordigen deze rijen in elke tabel precies? Als een werkitemactie een ander object is dan een werkitem (ze kunnen gerelateerd zijn) maar als ze niet hetzelfde object vertegenwoordigen, zijn ze verschillend), zouden ze in verschillende tabellen moeten staan.

Bovendien lijkt het erop dat je daar een een-op-veel-relatie hebt (één item kan veel acties hebben), dus alleen al om die reden zouden ze in verschillende tabellen moeten staan.

Wat betreft uw vraag over de overbodige informatie:als ze echt zijn overbodig, ze moeten worden gerepareerd.

De step_num . gebruiken wat betekent dit bijvoorbeeld precies? Als het een attribuut is van het werk item, het zou niet in de werk actie moeten zijn tafel helemaal niet.

Je zou het vanaf daar verwijderen en als je het stapnummer voor een rij in de werkactietabel wilde weten, zou je met de externe sleutel aan de werkitemtabel deelnemen.

Als het in plaats daarvan een attribuut is van de werkactie, moet u het uit de werkitemtabel verwijderen omdat het geen zin heeft. U heeft mogelijk twee acties met elk een ander stapnummer, dus wat is in dat geval het stapnummer van het bovenliggende item?

Natuurlijk heb je misschien een onderscheiden stapnummer voor beide items en acties - in dat geval zou ik overwegen de naam te wijzigen om de bedoeling duidelijk te maken, zoiets als item_step_num en action_step_num .

Bottom line is om te beginnen met 3NF. Als uw database op een gegeven moment te traag werkt, dan overweeg terug te keren naar een mindere vorm. Je kunt dan een ander vragen vraag hier hoe je de problemen die daaruit voortkomen kunnen herkennen en verminderen (bijvoorbeeld de mogelijkheid van inconsistente gegevens op twee plaatsen en het gebruik van triggers om dat te voorkomen).




  1. Formule (vergelijkingen) opslaan in database om later te evalueren (SQL Server 2005)

  2. Vragen van de synchrone node.js

  3. Geneste PIPELINED-functie

  4. Laravel:dynamisch verbinding maken met databases