Creazione di una tabella specifica per colonne condivise tra altre tabelle (modelli)?

1

Sto creando una webapp che ha una varietà di modelli: prodotto, categoria, productOption, ecc.

Tutti questi modelli hanno una serie di attributi condivisi: nome, descrizione, immagine, ecc.

Ci sono due opzioni che vedo: 1. aggiungere tutti questi attributi come colonne a ciascuna tabella del modello. 2. crea una meta tabella separata che contenga queste colonne con una relazione polimorfica tra un modello e il meta.

Opzione 1:

products
    id
    ...
    name
    description
    image
product_categories
    id
    ...
    name
    description
    image

Opzione 2:

products
    id
    ...
product_categories
    id
    ...
metas
    id
    name
    description
    image
    metaable_id // foreign key
    metaable_type // model type (Product, ProductCategory)

C'è una decisione chiara qui? Mi mancano alcune alternative? Grazie.

    
posta Shane 05.08.2015 - 02:38
fonte

1 risposta

3

Per me, non c'è dubbio. Vai con l'opzione 1 .

Ha senso che tu abbia prodotti e categorie. Sono diversi e non dovrebbero essere costretti a vivere nello stesso tavolo. Tuttavia, un productName (abbreviato in "nome") è non uguale a categoryName (abbreviato anche in "nome"). Puoi usare il contesto per capire quale 'nome' intendi.

Guarda in un altro modo:

Immagina che siano passati 5 anni in futuro. Il tuo codice è in produzione, ha successo e un team di persone ha aggiunto funzionalità ad esso. Ci sono molti nuovi modelli oltre a prodotti e categorie. Diciamo che ce ne sono circa 20.

  1. Quale opzione sarebbe più facile con cui lavorare?
  2. Quale opzione sarà più facile da seguire per una nuova assunzione?

Dì che eri via per quei 5 anni e ora stai tornando a questo codice.

  1. Quale opzione avrà incasinato la squadra?
  2. Quale opzione seguirai più facilmente?

(Probabilmente puoi indovinare che avrei risposto Opzione 1 per tutte queste domande)

Vedo da dove vieni con l'Opzione 2, ma IMHO sembra un enorme piatto di codice spaghetti che aspetta solo di succedere. Anche se hai la disciplina per tenerlo pulito, il programmatore che viene dopo di te non può.

Sono d'accordo con Brandon sul fatto che potrebbe esserci qualche situazione in cui l'Opzione 2 inizia a sembrare vitale, ma dovrebbe essere molto più esotica di "nome", "descrizione" o "immagine".

    
risposta data 05.08.2015 - 04:15
fonte