Schema proposto
Innanzitutto, ecco un esempio del mio schema proposto da fare riferimento in tutto il mio post:
Clothes
----------
ClothesID (PK) INT NOT NULL
Name VARCHAR(50) NOT NULL
Color VARCHAR(50) NOT NULL
Price DECIMAL(5,2) NOT NULL
BrandID INT NOT NULL
...
Brand_1
--------
ClothesID (FK/PK) int NOT NULL
ViewingUrl VARCHAR(50) NOT NULL
SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL
Brand_2
--------
ClothesID (FK/PK) int NOT NULL
PhotoUrl VARCHAR(50) NOT NULL
SomeOtherBrand2SpecificAttr VARCHAR(50) NOT NULL
Brand_X
--------
ClothesID (FK/PK) int NOT NULL
SomeOtherBrandXSpecificAttr VARCHAR(50) NOT NULL
Dichiarazione problema
Ho una tavola dei vestiti che ha colonne come nome, colore, prezzo, brandid e così via per descrivere gli attributi di un particolare capo di abbigliamento.
Ecco il mio problema: diversi marchi di abbigliamento richiedono informazioni diverse. Qual è la migliore pratica per affrontare un problema come questo?
Si noti che per i miei scopi, è necessario trovare informazioni specifiche sul marchio a partire da una voce di abbigliamento . Questo perché visualizzo prima le informazioni da una voce di abbigliamento all'utente, dopodiché devo utilizzare le informazioni specifiche del marchio per acquistare l'articolo. In sintesi, deve esserci una relazione direzionale tra i vestiti (da) e le tabelle brand_x .
Soluzione proposta / attuale
Per far fronte a questo, ho pensato al seguente schema di progettazione:
La tabella dei vestiti avrà una colonna di marca che può avere valori di id che vanno da 1 a x, dove un particolare ID corrisponde a una tabella specifica del marchio. Ad esempio, il valore ID 1 corrisponderà alla tabella brand_1 (che potrebbe avere una colonna url ), l'id 2 corrisponderà a brand_2 (che potrebbe avere una colonna fornitore ), ecc.
Pertanto, per associare una particolare voce di abbigliamento alle informazioni specifiche del marchio, immagino che la logica a livello di applicazione sarà simile a questa:
clothesId = <some value>
brand = query("SELECT brand FROM clothes WHERE id = clothesId")
if (brand == 1) {
// get brand_1 attributes for given clothesId
} else if (brand == 2) {
// get brand_2 attributes for given clothesId
} ... etc.
Altri commenti e pensieri
Sto tentando di normalizzare il mio intero database in BCNF e, sebbene sia quello che mi è venuto in mente, il codice dell'applicazione risultante mi fa sentire molto ansioso. Non c'è modo di imporre relazioni se non a livello di applicazione, e quindi il design sembra molto confuso e, presumo, molto soggetto a errori.
Ricerca
Mi sono assicurato di controllare le voci precedenti prima di scrivere un post. Ecco un post con un problema quasi identico che sono riuscito a trovare. Ho comunque pubblicato questo post perché sembra che l'unica risposta fornita non abbia una soluzione basata su design o SQL (ovvero menzioni OOP, ereditarietà e interfacce).
Sono anche un po 'alle prime armi quando si tratta di progettazione di database, e quindi apprezzerei qualsiasi intuizione.
Sembra che ci siano risposte più utili su Stack Overflow:
- Qui
- E qui
- Aaaand here (concetto chiave: ereditarietà delle classi)
Ho fatto riferimento alle soluzioni e suggerisco ad altri di trovare la mia domanda.
Nonostante i link sopra indicati, sono ancora alla ricerca di risposte qui e apprezzerei tutte le soluzioni fornite!
Sto usando PostgreSQL.