Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy istnieje sposób na utrzymanie relacji db (pk/fk) w następującym scenariuszu?

Twój projekt niczego nie „wydaje się”, ponieważ nie potrafimy czytać w Twoich myślach. Podałeś pewne aspekty projektu, ale nie podałeś „scenariusza” biznesowego, który reprezentuje/wdraża/opisuje lub jak to robi.

SQL NULL, UNIQUE, PK i FK to rodzaje ograniczeń. Ograniczenie to ograniczenie tego, jakie wartości z bazy danych mogą się pojawić. SQL FK mówi, że wartości podrzędów dla listy kolumn w tabeli muszą pojawić się gdzie indziej dla listy kolumn, których kolumny tworzą zestaw kolumn SQL UNIQUE NOT NULL (co jest przypadkiem PK) w ich tabeli. Jeśli Twój projekt podlega ograniczeniu i nie wynika z innych wymuszonych ograniczeń, wyegzekwuj je. W przeciwnym razie nie. Najlepiej deklaratywnie. Większość DBMS SQL pozwala zadeklarować tylko kilka rodzajów tanich do wyegzekwowania ograniczeń. Inne muszą być egzekwowane za pomocą wyzwalaczy.

Ograniczenia są konsekwencją kryteriów wchodzenia wierszy do tabel i pozostawania poza tabelami w danej sytuacji (tabela predykaty , „co oznaczają tabele”) oraz jakie sytuacje mogą, a jakich nie mogą zaistnieć zgodnie z Twoimi zasadami biznesowymi. Nie wiemy, co to jest, chyba że nam powiesz. Możemy mieć nadzieję, że zgadniemy, używając nazw tabel i kolumn, wszelkich innych informacji, które podasz i zdrowego rozsądku.

Ty muszę powiedzieć nam albo ograniczenia, albo predykaty i jakie sytuacje mogą/nie mogą powstać.

Tutaj twoje tabele używają prostej tabeli plus trochę projektu EAV do rejestrowania danych z jakiejś prostej tabeli, która nie jest wyraźnie w twoim projekcie. Jak zawsze możesz unikaj EAV, używając tylko DDL, aby zachować aktualność schematu i ograniczeń prostej tabeli, ale zamiast tego wybrałeś schemat statyczny, który wymaga bardziej złożonego schematu, zapytań i ograniczeń. Prostym wyrażeniem ograniczeń EAV jest zazwyczaj to, że prosta tabela, którą reprezentują, ma pewne ograniczenia oraz, że t_criteria_x są jej widokami i/lub że jest ich widokiem. Ale zazwyczaj jedyne dostępne deklaracje SQL pozwalają wyrazić fragmenty tego.

zgaduję to, co zamierzasz tutaj, obejmuje to, że dla każdej tabeli t_criteria_x jej wartość PK musi pojawić się w t_criteria_director z wartością table_name „t_criteria_x”. Innym sposobem wyrażenia tego jest to, że jeśli dodasz do t_criteria_x kolumnę nazwa_tabeli z wartością 't_kryteria_x', wynik musi mieć podrzędy (id, nazwa_tabeli) jako podrzędy t_kryteria_director (identyfikator_kryteriów, nazwa_tabeli). Jeśli również t_criteria_director (identyfikator_kryterium, nazwa_tabeli) to wiersze SQL UNIQUE NOT NULL, to mamy, że rozszerzone t_criteria_x ma złożony kod SQL FK (id, nazwa_tabeli) odwołujący się do t_criteria_director (identyfikator_kryterium, nazwa_tabeli). Możesz to wyrazić deklaratywnie, faktycznie rozszerzając t_criteria_x o takie (prawdopodobnie wyliczone/wygenerowane/obliczone) kolumny. Ale prawdopodobnie masz też inne ograniczenia, na przykład nie ma żadnych par (constraint_id, table_name) w t_criteria_director, do których nie odwołuje się jakiś rozszerzony t_constraint_x.

Wywołanie kolumny nazwa_tabeli pokazuje zorientowane na implementację stronniczość z EAV, ponieważ ta kolumna jest dyskryminatorem typu/wariantu/tagiem w sensie ER, że typy jednostek reprezentowanych przez identyfikatory w tabelach t_criteria_x są „podtypami” typu jednostki reprezentowanej przez t_criteria_director. (Jest to również koncepcja/technika ze struktur danych rekordów 3GL używanych do dynamicznej symulacji typowania). Po tym wszystkim, że wartość kolumny nazwa_tabeli nie musi być nazwą tabeli, musi to być tylko wartość identyfikująca podtyp jednostki, a takie jednostki nie muszą uczestniczyć tylko w relacji/skojarzeniu jednej tabeli. (Zbadaj podtypy SQL/bazy danych/ER/polimorfizm/dziedziczenie i projekt anty-wzorców dwa/wiele/wiele FK [sic] do dwóch/wielu/wielu tabel).

Musisz określić, jakie są predykaty tabeli i jakie są ich ograniczenia. Najlepiej poprzez określenie, jaka jest prosta tabela, którą wspólnie reprezentują, i jaki jest jej predykat oraz jakie ograniczenia bazy danych z niej korzystają. Następnie musisz zdecydować, czy pod względem kosztów/korzyści zamierzasz zmodyfikować swój projekt, aby uczynić ograniczenia deklaratywnymi i/lub czy wymuszasz ograniczenia za pomocą wyzwalaczy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql NIE W I NIE ISTNIEJE tak samo?

  2. Klasyczne ASP + Motobit Pure ASP Upload + UTF-8 Charset

  3. nie można zwiększyć limitu otwartych plików w mariadb 10 na centos7

  4. Jak naprawić serializowany ciąg, który został uszkodzony przez nieprawidłową długość licznika bajtów?

  5. Django + MySQL - Strona administracyjna - Dodaj użytkownika - OperationalError - SAVEPOINT nie istnieje