Domanda

direi questa è una domanda semi-comune, ma non riesco a trovarlo nella lista delle domande precedenti. Ho una serie di tabelle per i prodotti che necessitano di condividere un indice chiave primaria. Assumere qualcosa di simile al seguente:

product1_table:
    id,
    name,
    category,
    ...other fields

product2_table:
    id,
    name,
    category,
    ...other fields

product_to_category_table:
    product_id,
    category_id

Chiaramente, sarebbe utile avere un indice condiviso tra le due tabelle di prodotto. Nota, l'idea di tenerli separati è perché hanno in gran parte diversi gruppi di campi al di là delle nozioni di base, tuttavia essi condividono una categorizzazione comune.

UPDATE:

tabella

Un sacco di persone hanno suggerito di successione (o Gen-spec). Questa è un'opzione Sono consapevole di ma dato in altri sistemi di database ho potuto condividere una sequenza tra le tabelle che speravo MySQL ha avuto una soluzione simile. Io assumere non in base alle risposte. Mi sa che dovrò andare con ereditarietà delle tabelle ... Grazie a tutti voi.

È stato utile?

Soluzione

Non è molto comune, no. Non c'è modo nativo per condividere una chiave primaria. Cosa potrei fare nella tua situazione è questa:

product_table
    id
    name
    category
    general_fields...

product_type1_table:
    id
    product_id
    product_type1_fields...

product_type2_table:
    id
    product_id
    product_type2_fields...

product_to_category_table:
    product_id
    category_id

Cioè, c'è un tavolo prodotto principale che ha voci per tutti i prodotti e ha i campi che generalize tra i tipi e le tabelle di tipo specificato con chiavi esterne nella tabella prodotto principale, che hanno i dati di tipo-specifici.

Altri suggerimenti

Un design migliore è quello di mettere le colonne comuni in una tabella prodotti, e le colonne speciali in due tavoli separati. Utilizzare il product_id come chiave primaria in tutte e tre le tabelle, ma nelle due tabelle speciali è, inoltre, un back chiave esterna alla tabella prodotti principali.

Questo semplifica la ricerca di base del prodotto per gli ID e nomi per categoria.

Si noti, inoltre, che il vostro disegno permette ad ogni prodotto per essere in una categoria al massimo.

Sembra siete alla ricerca di ereditarietà delle tabelle.

Si potrebbe usare un product tavolo comune con attributi comuni sia product1 e product2, più un attributo type che potrebbe essere sia "product2" o "product1"

Poi tavoli product1 e product2 avrebbe tutti i loro attributi specifici e un riferimento al genitori Tavolo product.

product:
    id,
    name,
    category,
    type

product1_table:
    id,
    #product_id,
    product1_specific_fields

product2_table:
    id,
    #product_id,
    product2_specific_fields

Per prima cosa lasciatemi dire che sono d'accordo con tutto ciò che il Caos, Larry e Phil hanno detto.

Ma se ti ostini a un altro modo ...

Ci sono due ragioni per il vostro PK condivisa. Un'unicità tra le due tabelle e due per completare l'integrità referenziale.

Io non sono sicuro di quello che "sequenza" dispone il supporto colonne AUTO_INCREMENT. E sembra che ci sia un impostazione di sistema per definire l'incremento in valore, ma nulla per colonna.

Quello che vorrei fare in Oracle è solo condividere la stessa sequenza tra le due tabelle. Un'altra tecnica potrebbe essere quella di impostare un valore STEP 2 nel auto_increment e iniziare a uno a uno e l'altro a 2. In entrambi i casi, si sta generando valori univoci tra di loro.

Si potrebbe creare una terza tabella che non ha nulla ma la colonna PK. Questa colonna potrebbe anche fornire l'Autonumerazione se non c'è modo di creare un autonumber saltare all'interno di un server. Poi su ciascuna delle tabelle tecniche che si desidera aggiungere trigger CRUD. Un inserimento in una delle tabelle di dati dovrebbe prima di avviare un'operazione di inserimento nella tabella indice pseudo (e restituire l'ID per l'uso nella tabella locale). Allo stesso modo un eliminazione dalla tabella locale sarebbe avviare una eliminazione dalla tabella indice pseudo. Tutte le tabelle dei bambini che hanno bisogno di puntare a un punto di genitore a questa tabella indice di pseudo.

Si noti questa dovrà essere una per ogni trigger di riga e rallenterà CRUD su queste tabelle. Ma le tabelle come "prodotto" tendono a non avere un tasso molto elevato di DML, in primo luogo. Chi si lamenta della "impatto sulle prestazioni" è non scala in considerazione.

Attenzione, questa viene fornita come alternativa funzionante e non la mia raccomandazione come il migliore via

Non si può "condividere" una chiave primaria.

Senza conoscere tutti i dettagli, il mio consiglio è quello di combinare le tabelle in un'unica tabella prodotto. Avere campi opzionali che sono popolate per alcuni prodotti e non altri non è necessariamente una cattiva progettazione.

Un'altra opzione è quella di avere una sorta di modello di ereditarietà, dove si ha un unico tavolo di prodotto, e poi due prodotti tabelle "sottotipo", che fanno riferimento alla tabella prodotto principale e hanno un proprio insieme specializzato di campi. Interrogazione di questo modello è più doloroso di una singola tabella IMHO, è per questo io lo vedo come l'opzione meno desiderabile.

Il tuo spiegazione è un po 'vago, ma, dalla mia comprensione di base sarei tentato di fare questo

La tabella contiene i campi comuni

product
-------
product_id
name
...

tavolo product_extra1 e la tabella product_extra2 contengono campi diversi queste tabelle habe una relazione uno a uno tra il rispettare product.product_id e product_extra1.product_id ecc rispettare la relazione uno a uno impostando la product_id nelle tabelle chiave esterna (product_extra1, ecc) per essere unico utilizzando un vincolo univoco. è necessario deciso sulle regole di business su come è popolato questi dati

product_extra1
---------------
product_id
extra_field1
extra_field2
....

product_extra2
---------------
product_id
different_extra_field1
different_extra_field2
....

In base a quello che hai sopra la tabella categoria_prodotto è una tabella di intersezione (da 1 a molti - molti a 1) che implicherebbe che ogni prodotto può essere correlato a molte categorie Questo può ora rimanere lo stesso.

Questo è l'ennesimo caso di Gen-spec.

Vedi precedente discussione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top