Mysql
 sql >> Database >  >> RDS >> Mysql

C'è un modo per mantenere una relazione db (pk/fk) nello scenario seguente

Il tuo design non "sembra" nulla perché non possiamo leggere la tua mente. Hai fornito alcuni aspetti di un progetto ma non lo "scenario" aziendale che rappresenta/implementa/descrive o come lo fa.

SQL NULL, UNIQUE, PK e FK sono tipi di vincoli. Un vincolo è una limitazione su quali valori di database possono essere visualizzati. Un SQL FK dice che i valori di sottobrow per un elenco di colonne in una tabella devono apparire altrove per un elenco di colonne le cui colonne formano un insieme di colonne SQL UNIQUE NOT NULL (di cui PK è un caso) nella loro tabella. Se il tuo progetto è soggetto a un vincolo e non è implicato da altri vincoli imposti, applicalo. Altrimenti no. Preferibilmente dichiarativamente. La maggior parte dei DBMS SQL consente di dichiarare solo alcuni tipi di vincoli economici da applicare. Altri devono essere applicati tramite trigger.

I vincoli sono una conseguenza dei criteri per le righe che entrano rispetto a quelle che restano fuori dalle tabelle in una determinata situazione (la tabella predica , "cosa significano le tabelle") e quali situazioni possono e non possono verificarsi in base alle tue regole aziendali. Non sappiamo cosa siano, a meno che tu non ce lo dica. Possiamo sperare di indovinare usando i nomi delle tue tabelle e colonne, qualsiasi altra informazione che fornisci e il buon senso.

Tu dobbiamo dirlo a ci i vincoli oi predicati e quali situazioni possono/non possono sorgere.

Qui le tue tabelle utilizzano una tabella semplice più un design EAV per registrare i dati di una tabella semplice non esplicitamente nel tuo design. Come sempre potresti evita EAV semplicemente usando DDL per mantenere aggiornati lo schema e i vincoli della tabella semplice, ma invece hai scelto uno schema statico che richiede schema, query e vincoli più complessi. L'espressione diretta dei vincoli EAV è in genere che la tabella semplice che rappresentano ha determinati vincoli più che i t_criteria_x sono viste di esso e/o che è una vista di essi. Ma in genere le uniche dichiarazioni SQL disponibili ti consentono solo di esprimere frammenti di ciò.

Immagino che ciò che intendi qui include che per ogni tabella t_criteria_x il suo valore PK deve apparire in t_criteria_director con un valore table_name 't_criteria_x'. Un altro modo per dirlo è che se hai aggiunto a t_criteria_x una colonna table_name con il valore 't_criteria_x', il risultato deve avere (id, table_name) i subbrows appaiono come t_criteria_director (criteria_id, table_name) subbrows. Se anche t_criteria_director (criteria_id, table_name) i subrows sono SQL UNIQUE NOT NULL quindi abbiamo che t_criteria_x aumentata ha un FK SQL composito (id, table_name) che fa riferimento a t_criteria_director (criteria_id, table_name). Puoi esprimerlo in modo dichiarativo aumentando effettivamente t_criteria_x con tali colonne (possibilmente calcolate/generate/calcolate). Ma probabilmente hai anche altri vincoli, ad esempio non ci sono coppie (constraint_id, table_name) in t_criteria_director che non sono referenziate da alcuni t_constraint_x aumentati.

La chiamata alla colonna table_name mostra una distorsione orientata all'implementazione dall'EAV perché quella colonna è un tipo/variante discriminatore/tag nel senso ER che i tipi di entità rappresentate dagli id ​​nelle tabelle t_criteria_x sono "sottotipi" del tipo di entità rappresentato da t_criteria_director. (Questo è anche un concetto/tecnica delle strutture di dati dei record 3GL utilizzate per simulare dinamicamente la digitazione.) Dopo tutto, il valore della colonna table_name non deve essere un nome di tabella, deve solo essere un valore che identifichi il sottotipo di entità e tali entità non devono partecipare solo alla relazione/associazione di una tabella. (Ricerca SQL/database/sottotipizzazione ER/polimorfismo/ereditarietà e progettazione anti-modello di due/molti/più FK [sic] a due/molti/più tabelle.)

Devi determinare quali sono i predicati della tabella e quali sono i loro vincoli di conseguenza. Preferibilmente determinando qual è la tabella semplice che rappresentano collettivamente e qual è il suo predicato e quali sono i vincoli del database che lo utilizzano. Quindi devi decidere se in base al costo/beneficio intendi modificare il tuo progetto per rendere i vincoli dichiarativi e/o applicare o meno i vincoli tramite trigger.