Come devo modellare una relazione "o / o"?


12

Supponiamo di avere un'entità denominata Software e due sottotipi FreeSoftware e NonFreeSoftware. L'entità NonFreeSoftware ha attributi come data di acquisto, fornitore, ecc. L'entità FreeSoftware ha attributi come licenza, URL del codice sorgente, ecc.

Quindi, se voglio modellare un'altra entità, OperatingSystem, come dovrei farlo? Esiste una relazione "è una" con il software ma una relazione "o / o" con FreeSoftware e NonFreeSoftware.

Penso che mi manchi qualcosa nel modo in cui sto analizzando questa gerarchia.


Rivedi questa risposta . Copre i dettagli di implementazione della modellazione di questo tipo di relazione.
Nick Chammas,

Risposte:


8

Il modo per gestirlo è che i tuoi sottotipi devono essere determinati dal super-tipo (cioè il PK del sottotipo è anche un FK dal sottotipo al super-tipo).

La sfida è capire se qualcosa si escluda a vicenda o meno. Gli attributi dei sottotipi dovrebbero applicarsi solo a quei sottotipi, ma è possibile che alcuni sottotipi si escludano a vicenda e altri no.

Se si dispone di alcuni sottotipi reciprocamente esclusivi, è possibile utilizzare un attributo di partizionamento sul super-tipo per indicare quale dei (due o più) sottotipi reciprocamente esclusivi si applicano. Questo attributo di partizionamento può essere utilizzato con vincoli o trigger per applicare l'esclusività reciproca.

Se si hanno sottotipi che non si escludono a vicenda, possono esistere senza utilizzare alcun attributo di partizionamento.

Considera questo modello di dati:

ERD

Hai tre super-tipi, ma i tipi FREE_SOFTWAREe NON-FREE_SOFTWAREsi escludono a vicenda, in base SOFTWARE.free_not_freeall'attributo di partizionamento flag. Qualsiasi dato software è anche potenzialmente un OPERATING_SYSTEM, indipendentemente dal fatto che sia gratuito o meno.


1
Leggermente OT: cosa hai usato per realizzare questo diagramma ER?
Daniel Serodio,

@DanielSerodio - Ho usato Visio con forme intelligenti che mi sono costruito sulla base della notazione ERD di James Martin. Le forme usano una trama di linea personalizzata per dare loro un aspetto informale, che trovo utile per ricordare alle persone quando un diagramma è uno "schizzo" o un progetto di bozza.
Joel Brown,

@JoelBrown Saresti disposto a condividere i tuoi stampini? Queste sono forme davvero carine
imoatama

2
@imoatama - È passato un po 'di tempo, ma alla fine ho iniziato a pubblicare lo stencil qui: moosewarevisioerd.codeplex.com Nota come nella descrizione che le forme intelligenti dello stencil sono state costruite per una versione precedente di Visio e alcuni dei comportamenti del le forme del connettore di relazione possono essere un po 'instabili. Un giorno mi metto in giro per sistemare tutto.
Joel Brown,

1

Perché OperatingSystem dovrebbe essere un'entità completamente nuova? Dovrebbe rientrare in quello Software, poiché è quello che è. E un sistema operativo (se chiuso) avrebbe una data di acquisto, un fornitore, ecc. E un sistema operativo open source avrebbe una licenza, un URL del codice sorgente, ecc.

Consiglierei una relazione con SoftwareTypeo qualcosa del genere. È a quel punto che potresti / dovresti specificare se il Software è un sistema operativo o un'applicazione o qualsiasi altro tipo di software che stai supportando.


Vorrei che OperatingSystem fosse un'entità separata in quanto è una specializzazione del software. Può avere attributi che nessun altro software avrà (come tipo di kernel, flag RTOS-o-no, flag multiutente, ecc.).
jl6,

1
@ jl6 Mi permetto ancora di differire qui. Ogni pezzo di software (sia esso un sistema operativo o meno) avrà attributi specifici. Quelli possono essere memorizzati altrove. Stai riducendo al minimo la scalabilità mantenendo il sistema operativo separato.
Thomas Stringer,

Se ho capito bene, stai raccomandando un'entità Software e un'entità SoftwareType. Stai dicendo che Free, NonFree e OperatingSystem sono solo diverse istanze di SoftwareType? Sono sicuro che hai ragione, ma allora dove memorizzi i vari attributi dei diversi tipi?
jl6,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.