Specializzazione di una tabella

Gianni, ho incontrato questo problema durante l'esercizio di modellazione di una base di dati:

avendo una tabella "properties" che contiene i dati per la definizione di una proprietà (immobile) utilizzando la specializzazione in "flat", "hotel", "bed&breakfast" e "house" devo tradurre ogni specializzazione in una tabella, che differisce nelle altre per determinate caratteristiche.

credo di esserci fin qui.

Ad esempio, un hotel, ha un numero di camera, le opzioni per il servizio in camera e altri attributi che, ad esempio, un appartamento non ha.

Quindi la specializzazione in questo caso è utile, ma mi chiedo questo:

utilizzando la specializzazione di proprietà in hotel, appartamento, casa e b&b per ogni nuova categoria dovrei creare una tabella che raccoglie gli attributi intrinseci di quella specializzazione...poco male.

Ma dovrei anche trovare il modo di rendere il codice abbastanza flessibile per poter gestire le specializzazioni, infatti il codice non conoscerà a priori perchè gli attributi sono nel db, tutto questo è possibile?

Mi piacerebbe sapere cosa ne pensi dell'approccio che sto utilizzando, mi interessa imparare, non risolvere (per ora) il problema.

PS : Come esporto il grafico come immagine in rational rose?

 :bye:

inviato 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

ecco qui il "diagramma" appena iniziato della struttura (è la prima volta che uso uml per la modellazione della base di dati, personalmente credo sia più semplice il diagramma ER ma non so come farli in RR)

Spero sia corretto ed interpretabile  ;D

concettualmente la proprietà (che può essere base, hotel, flat, b&b o altre spec. di proprietà) è in associazione con utente tramite la chiave esterna author che contiene l'id dell'utente che ha inserito una determinata proprietà ( un utente può avere 0 o più proprietà ).

La proprietà a sua volta è contenuta in una categoria, la categoria è una chiave esterna verso Categories, dove c'è l'id e il tipo di categoria, questa viene utilizzata per due scopi:

identificare la precisa specializzazione da utilizzare in base alla categoria

mostrare all'utente in che categoria si trova la proprietà.

Ogni utente ha un gruppo di permessi, il gruppo di permessi dovrebbe (perchè non so ancora come fare) essere ereditato dal gruppo al quale l'utente appartiene.

E' possibile mascherare i permessi dell'utente con i permessi in permissionMask (quindi questa maschera i permessi dell'utente in quelli specificati a prescindere dal gruppo di appartenenza, ma forse questo è un approccio pericoloso, preferirei seguire un modello simile a quello usato su UNIX per la gestione dei permessi e dei gruppi )

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Per i diagrammi ER con il rational rose a lavoro usiamo il plugin "data modeler".

Tornando al discorso della specializzazione delle tabelle, ovvero dell'ereditarietà delle classi relative, nella mia esperienza non ho mai scritto del codice che si adattasse dinamicamente alla particolare specializzazione. Ho sempre scritto "a mano" il codice necessario a gestire ogni singola tabella. Questo perché nonostante le operazioni da compiere su ciascuna delle tabelle di specializzazione sembrano essere sempre le stesse, in realta hanno sempre qualche differenza che le rende differenti.

Ad esempio ogni tabella ha dei campi obbligatori ed altri facoltativi. Come può il codice saperlo a priori? Inoltre ogni tabella ha ulteriori regole che rendono valido ciascun record in esse contenuto. Queste regole devono essere esplicitamente contenute nel codice che gestisce la particolare tabella.

Per il resto mi sembra che vada bene.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Proprio come pensavo...

ok con lo zend, potrei fare un modulo ( inteso come blocco di software, una classe o più quindi, non un modulo del sito ) che mi gestisce una determinata specializzazione, in modo da poter aggiungere un file contenente le azioni sulla specializzazione per ognuna di esse, che ne dici?

E' valida l'idea di avere il nome della specializzazione in categories, in modo da poterla usare come identificativo nel sito (quindi come output per "raggruppare" in categorie le proprietà ) sia come nome della tabella contenente la specializzazione?

Riguardo i permessi degli utenti invece, qualche impressione?

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

L'organizzazione del codice è a tua discrezione, l'importante è renderlo modulare.

La tabella con i nomi delle categorie può andar bene, ma potrebbe essere sostituita anche da quanlche altra forma di memorizzazione, dato che i dati in essa contenuti praticamente non cambiano ne aumentano mai.

Per quanto riguarda i permessi, la gestione UNIX mi è sempre piaciuta  ;) però rischiamo di andare OT

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

mmh no le categorie dovrebbero essere aggiunte da parte dell'utente... perchè può aggiungere quando vuole un tipo di proprietà.

Qui sorgono i problemi...

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ma quando viene aggiunta una categoria, il codice per gestirla dovrà essere realizzato a mano?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Beh infatti è li che c'è il problema.

Avere una suddivisione in hotel, appartamento e b&b è già una buona cosa, ma non è estendibile a causa dell'utilizzo di determinate specializzazioni sul database.

Si potrebbe pensare ad ogni specializzazione (con il codice aggiuntivo per gestirla) come un modulo, scaricabile ed installabile direttamente dal pannello admin.

Magari con qualche meccanismo per rendere veloce e indorlore l'installazione.

 :bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Come vedi quindi avere una tabella per memorizzare le diverse categorie non contribuisce in alcun modo a rendere flessibile il sistema.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Accidenti, devo trovare una soluzione.

Dunque ora è così:

Ogni specializzazione viene elencata nella tabella categorie, la quale verrà anche utilizzata come tabella per contenere le categorie (intese come etichetta che rappresenta la famiglia di edifici alla quale la proprietà appartiene), il problema sorge quando vengono inseriti nuovi record nella tabella categorie, perchè così si crea il presupposto che ad ogni record in categorie corrisponda una specializzazione.

Quindi ho pensato di separare il concetto di categoria e quello di specializzazione in questo modo:

così si distinguono le categorie dalle specializzazioni, però creando ridondanza, ecco un'esempio:

Hotel è una Proprietà, Proprietà rientra quindi nella categoria indicata dalla specializzazione, che è Hotel in questo caso, ma avendo separato il concetto di Categoria da quello di Specializzazione ora devo avere anche un'attributo della tabella Categorie che mi dice che quello è un hotel, creando così una ridondanza.

La soluzione potrebbe anche portare a problemi di coerenza, cioè avere 4 Specializzazioni e 40 Categorie è un non senso.

Se è una categoria, deve avere una specializzazione.

Quindi infine sono giunto a quest'altra conclusione:

In questo caso viene usato un attributo come "titolo" della specializzazione, sarà l'etichetta visibile all'utente nelle caratteristiche della proprietà, ed un attributo "name" che identifica il suffisso della specializzazione da utilizzare.

Qui ho illustrato il mio ragionamento per "risolvere il problema".

Qual'è la soluzione migliore delle tre, quella che può creare meno problemi con l'avanzare della produzione.

Secondo me, valutando la possibilità di aggiungere moduli di specializzazione installabili tramite admin cp l'ultima alternativa è la migliore, peccato che non permetta una categorizzazione più flessibile per l'utente (nel caso voglia ordinare in modo meticoloso le strutture in categoria->sotto categoria->sotto categoria) anche se è possibile comunque usare delle tag per identificare in modo personalizzato ogni proprietà.

Le frecce tratteggiate le ho messe a indicare che l'attributo "name" di "Properties_Specs" contiene il nome della specializzazione da utilizzare, label invece è l'etichetta, essa contiene il nome della categoria che sarà visibile all'utente.

Sono state usate bene?

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Dunque ora ho fatto qualche sistemazione:

* ho aggiunto l'aggregazione di Specs_Hotel in Properties, infatti Specs_Hotel rappresenta una stanza di hotel, che senza hotel non avrebbe senso di esistere.

In questo modo posso referenziare la stanza all'hotel per poter avere una sorta di gestione dell'hotel con tutte le sue camere.

* ho aggiunto il gruppo di utenti, anche se è da sistemare, infatti non mi sembra il massimo per ora.

sto iniziando ad aggiungere le altre tabelle (gestione dei contenuti e news e poi tutto quello che trovo necessario dopo aver fatto qualche use case).

PS: ma Rational Rose lo posso usare anche per farmi diagrammi di sequenza ed use case?

Cioè ho visto che li ha, ma a quanto pare è fatto ad-hoc per la modellazione di basi di dati.

Sbaglio?

PPS: Se ci sono errori nei diagrammi (e sono certo che ce ne sono tanti) ti prego di avvertirmi, così posso capire dove sbaglio (e cosa).

 :bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda