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

Tabele bazy danych, jedna tabela odwołująca się do wielu niepowiązanych tabel

Z mojego doświadczenia wynika, że ​​gdy programiści próbują uczynić swój system naprawdę „dynamicznym”, w rzeczywistości próbują kodować problemy, o których jeszcze nie pomyśleli. To zwykle zła droga. Czy to naprawdę taka dodatkowa praca, aby moduł zawierał dwie tabele zamiast jednej?

W każdym przypadku, w którym widziałem wzór (lub anty-wzorzec?) próbując zrobić ogólny stół „zadaje wszystko”, spadł on płasko na twarz. Systemy RDBMS działają najlepiej w dobrze zdefiniowanych obszarach problemowych. Jeśli moduł ma potrzebę przechowywania historii, moduł powinien dodać tabelę historii, która będzie pasować do samej tabeli. Ma to również ogromną zaletę, ponieważ prawdopodobnie będziesz chciał przechowywać różne rodzaje informacji w historii w zależności od tabeli lub modułu, dla którego jest przechowywana historia. Jeśli masz ogólną tabelę historii, która staje się znacznie trudniejsza.

Teraz, jeśli chcesz po prostu przechwycić ostatniego użytkownika, który aktualizuje lub wstawia określony element (wiersz tabeli), który może znajdować się w wielu tabelach, możesz użyć wzorca dziedziczenia, w którym masz tabelę nadrzędną i wiele tabel podrzędnych. Na przykład:

CREATE TABLE Audited_Items
(
    id    INT    NOT NULL    IDENTITY,
    CONSTRAINT PK_Audited_Items PRIMARY KEY CLUSTERED (id)
)
CREATE TABLE Articles
(
    id    INT            NOT NULL,
    [Article specific columns]
    CONSTRAINT PK_Articles PRIMARY KEY CLUSTERED (id),
    CONSTRAINT FK_Articles_Audited_Items FOREIGN KEY (id) REFERENCES Audited_Items (id)
)
CREATE TABLE Media
(
    id    INT            NOT NULL,
    [Media specific columns]
    CONSTRAINT PK_Media PRIMARY KEY CLUSTERED (id),
    CONSTRAINT FK_Media_Audited_Items FOREIGN KEY (id) REFERENCES Audited_Items (id)
)
CREATE TABLE Audit_Trail
(
    audited_item_id    INT         NOT NULL,
    audit_datetime     DATETIME    NOT NULL,
    user_id            INT         NOT NULL,
    [audit columns]
    CONSTRAINT PK_Audit_Trail PRIMARY KEY CLUSTERED (audited_item_id, audit_datetime),
    CONSTRAINT FK_Audit_Trail_Audited_Items FOREIGN KEY (audited_item_id) REFERENCES Audited_Items (id)
)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przechowuj czas między rekordami

  2. Obliczanie różnic wartości między dwoma rekordami w Eloquent

  3. uzyskanie wartości dodatkowej kolumny tabeli przestawnej laravel

  4. Wykrywanie, czy wartość OLD nie jest równa wartości NEW, a wartość OLD była równa NULL

  5. Mysql czas Unii V.S. oddzielne zapytanie jeden po drugim