PDA

View Full Version : [DB] normalizzazione


anonimizzato
09-02-2009, 17:39
Ciao a tutti,

cerco di spiegarmi al meglio su una situazione di normalizzazione DB che vorrei chiarire.

In pratica ho un sito che si occupa di pubblicare inserzioni relative a macchine da cucire industriali e non, usate e non.

In questo contesto abbiamo:
Inserzionisti => utenti (aziende) che si registrano per poter pubblicare le loro inserzioni.
Generalmente si tratta di piccole aziende (concerie, stirerie, ecc.) del settore che cercano di "piazzare" il loro usato.

Marche => sono i nomi dei produttori dei modelli di macchinari che sono presenti nelle inserzioni, come se avessi l'inserzione di una Punto 1.2 del '98, la marca ovviamente è FIAT.

Fin qui direi tutto senza problemi se non fosse che volendo una marca (FIAT) potrebbe essere anche inserzionista (raro), oppure ancora un'entità generica AZIENDA che, sul sito, può beneficiare di alcuni spazi sponsor per avere visibilità.

In pratica potremmo riassumere che esistono delle generiche entità AZIENDE (che sono i clienti del sito) che possono essere 1 o + delle situazioni qui sotto:

- Inserzionisti
- Marche
- Aziende "in evidenza" (spazio pubblicitario

Il punto è che dati generici come: nome azienda, tel., fax, sito, indirizzo ecc. potrebbero riguardare i dati di registrazione di un inserzionista.
Oppure ancora i dati delle aziende "segnalate" tra gli spazi pubblicitari.

Sperando di aver dato un'idea sufficiente, vi chiedo, mi conviene:

Creare un'unica tabella AZIENDA che contempli
- tutti i dati di registrazione dell'inserzionista
- un flag che mi indichi se lo stesso inserzionista è anche un'azienda "segnalata" o meno
- un flag che mi indichi che lo stesso inserzionista è una MARCA o meno

oppure separare le 3 cose in tabelle diverse?

Generalmente un INSERZIONISTA è un piccolo privato che pubblica ciò che vuole vendere ed è diverso dalle MARCHE (Produttori), tuttavia la possibilità che un soggetto "AZIENDA" possa essere contemporaneamente diverse entità mi lascia il dubbio su come procedere

Sapreste consigliarmi?

Grazie in anticipo.

cionci
09-02-2009, 19:11
Ti fai una tabella chiamata Anagrafica che contiene i riferimenti a tutte le aziende. Usi l'id della tabella Anagrafica come chiave esterna delle altre tabelle.

gugoXX
09-02-2009, 19:54
Ti fai una tabella chiamata Anagrafica che contiene i riferimenti a tutte le aziende. Usi l'id della tabella Anagrafica come chiave esterna delle altre tabelle.

Quoto. se non hai bisogno di constraint o comportamenti particolari e' la soluzione piu' semplice e nella maggior parte delle volte efficace.

Se la cosa non ti soddisfa puoi valutare il pattern di specializzazione.
Una tabella di entita' Azienda generica, con tutti i dati principali comuni alle 3 entita'.
3 tabelle in relazione 1:1 con la tabella azienda, con la stessa chiave primaria di azienda, ciascuna con i dati supplementari privati di ciascuna entita' (Es: gli inserzionisti potrebbero avere il numero di telefono di riferiemento per l'inserzione, le aziende per insersione pubblicitaria potrebbero avere dati relativi alle Pubbliche relazioni).
Il record in una delle tabelle di specializzazione avra' lo stesso identico valore di chiave primaria dell'analogo record (sicuramente esistente) della tabella generica
Il fatto che un'azienda sia di un tipo o di un altro (o di entrambi o di tutti) e' dato dall'esistenza o meno del record nella specifica sotto-tabella di specializzazione.
Le foreign key puntano tipicamente alle tabelle di specializzazione e non alla tabella generale delle aziende.
Questo e' il pattern tipicamente usato quando si vuole modellare il comportamento dell' Inheritance dei linguaggi ad oggetti nei database per la memorizzazione permanente della base dati.

anonimizzato
10-02-2009, 09:14
Perfetto era proprio quello che mi era venuto in mente stamattina mentre ci pensavo sotto la doccia. :D

Non ricordavo più il concetto di tabelle di specializzazione :doh:

Grazie ancora.