Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es eine Möglichkeit, im folgenden Szenario eine DB-Beziehung (pk/fk) aufrechtzuerhalten

Ihr Design „scheint“ nichts, weil wir Ihre Gedanken nicht lesen können. Sie haben einige Aspekte eines Designs angegeben, aber nicht das geschäftliche "Szenario", das es darstellt/implementiert/beschreibt oder wie es dies tut.

SQL NULL, UNIQUE, PKs &FKs sind Arten von Einschränkungen. Eine Einschränkung ist eine Einschränkung, welche Datenbankwerte angezeigt werden können. Ein SQL FK besagt, dass Unterzeilenwerte für eine Spaltenliste in einer Tabelle an anderer Stelle für eine Spaltenliste erscheinen müssen, deren Spalten einen SQL UNIQUE NOT NULL-Spaltensatz (was PK ist) in ihrer Tabelle bilden. Wenn Ihr Design einer Einschränkung unterliegt und nicht durch andere erzwungene Einschränkungen impliziert wird, erzwingen Sie sie. Sonst nicht. Am besten deklarativ. Bei den meisten SQL-DBMSs können Sie nur einige wenige Arten von Einschränkungen deklarieren, die billig zu erzwingen sind. Andere müssen über Trigger erzwungen werden.

Die Einschränkungen sind eine Folge der Kriterien für Zeilen, die in einer bestimmten Situation in Tabellen hineingehen oder aus Tabellen herausbleiben (die Tabellen-Prädikate , "was die Tabellen bedeuten") und welche Situationen gemäß Ihren Geschäftsregeln auftreten können und welche nicht. Wir wissen nicht, was das ist, es sei denn, Sie sagen es uns. Wir können hoffen, anhand Ihrer Tabellen- und Spaltennamen, aller anderen Informationen, die Sie uns geben, und des gesunden Menschenverstandes zu erraten.

Du müssen uns sagen entweder die Beschränkungen oder die Prädikate &welche Situationen auftreten/nicht auftreten können.

Hier verwenden Ihre Tabellen eine einfache Tabelle plus ein EAV-Design, um die Daten einer einfachen Tabelle aufzuzeichnen, die nicht explizit in Ihrem Design enthalten ist. Wie immer könnten Sie Vermeiden Sie EAV, indem Sie einfach DDL verwenden, um das Schema und die Einschränkungen der einfachen Tabelle auf dem neuesten Stand zu halten, aber stattdessen haben Sie ein statisches Schema gewählt, das komplexere Schemata, Abfragen und Einschränkungen erfordert. Der einfache Ausdruck der EAV-Einschränkungen ist typischerweise, dass die einfache Tabelle, die sie darstellen, bestimmte Einschränkungen hat und dass die t_criteria_x Ansichten davon sind und/oder dass es eine Ansicht von ihnen ist. Aber normalerweise lassen Sie die einzigen verfügbaren SQL-Deklarationen nur Fragmente davon ausdrücken.

Ich vermute Das, was Sie hier beabsichtigen, beinhaltet, dass für jede t_criteria_x-Tabelle der PK-Wert in t_criteria_director mit einem table_name-Wert 't_criteria_x' erscheinen muss. Anders ausgedrückt:Wenn Sie t_criteria_x eine Spalte table_name mit dem Wert 't_criteria_x' hinzugefügt haben, muss das Ergebnis Unterzeilen (id, table_name) als Unterzeilen t_criteria_director (criteria_id, table_name) enthalten. Wenn auch Die Unterzeilen von t_criteria_director (criteria_id, table_name) sind SQL UNIQUE NOT NULL, dann haben wir, dass das erweiterte t_criteria_x einen zusammengesetzten SQL-FK (id, table_name) hat, der auf t_criteria_director (criteria_id, table_name) verweist. Sie können dies deklarativ ausdrücken, indem Sie t_criteria_x tatsächlich um eine solche (möglicherweise berechnete/erzeugte/berechnete) Spalte erweitern. Aber Sie haben wahrscheinlich auch andere Beschränkungen, wie zum Beispiel, dass es keine Paare (constraint_id, table_name) in t_criteria_director gibt, die nicht von einer erweiterten t_constraint_x referenziert werden.

Das Aufrufen der Spalte Tabellenname zeigt eine implementierungsorientierte Verzerrung von der EAV, da diese Spalte ein Typ/Varianten-Diskriminator/Tag ist im ER-Sinn, dass die Typen von Entitäten, die durch die IDs in den t_criteria_x-Tabellen dargestellt werden, "Untertypen" des durch t_criteria_director dargestellten Entitätstyps sind. (Dies ist auch ein Konzept/eine Technik von 3GL-Record-Datenstrukturen, die zum dynamischen Simulieren von Typisierung verwendet werden.) Schließlich muss der Spaltenwert table_name kein Tabellenname sein, es muss nur ein Wert sein, der den Untertyp der Entität identifiziert, und solche Entitäten müssen nicht nur an der Beziehung/Verknüpfung einer Tabelle teilnehmen. (Untersuchen Sie SQL/Datenbank/ER-Subtypisierung/Polymorphismus/Vererbung und das Design von Anti-Pattern zwei/viele/mehrere FKs [sic] zu zwei/vielen/mehreren Tabellen.)

Sie müssen bestimmen, was die Tabellenprädikate sind und was ihre Einschränkungen folglich sind. Vorzugsweise über die Bestimmung, was die einfache Tabelle ist, die sie gemeinsam darstellen, was ihr Prädikat ist und welche Datenbankeinschränkungen sie verwenden. Dann müssen Sie entscheiden, ob Sie Ihr Design pro Kosten/Nutzen ändern, um Beschränkungen deklarativ zu machen, und/oder ob Sie Beschränkungen über Trigger erzwingen oder nicht.