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

Projekt bazy danych:obiekty o różnych atrybutach

Jest to klasyczny projekt OO do niedopasowania impedancji tabel relacyjnych. Opisany projekt tabeli jest znany jako „tabela na podklasę”. Trzy najpopularniejsze projekty są kompromisami w porównaniu z tym, jak Twoje obiekty faktycznie wyglądają w Twojej aplikacji:

  1. Tabela według klas betonu
  2. Tabela według hierarchii
  3. Tabela na podklasę

Projekt, którego nie lubisz — „gdzie tabele mają 100 kolumn, a większość wartości ma wartość NULL” — to 2. jedna tabela przechowująca całą hierarchię specjalizacji. Jest to najmniej elastyczne z różnych powodów, w tym - jeśli Twoja aplikacja wymaga nowej podklasy, musisz dodać kolumny. Projekt, który opisujesz, znacznie lepiej dostosowuje się do zmian, ponieważ możesz go rozszerzyć, dodając nową tabelę podklasy opisaną wartością w product_type.

Pozostała opcja - 1. Tabela na konkretną klasę - jest zwykle niepożądana ze względu na duplikację związaną z implementacją wszystkich wspólnych pól w każdej tabeli specjalizacji. Chociaż zaletą jest to, że nie trzeba wykonywać żadnych łączeń, a tabele podklas mogą znajdować się nawet w różnych instancjach bazy danych w bardzo dużym systemie.

Opisany przez Ciebie projekt jest całkowicie opłacalny. Poniższa odmiana pokazuje, jak mogłoby to wyglądać, gdybyś używał narzędzia ORM do wykonywania operacji CRUD. Zwróć uwagę, że identyfikator w każdej tabeli podklasy JEST wartością FK tabeli nadrzędnej w hierarchii. Dobry ORM będzie automatycznie zarządzał poprawną tabelą podklas CRUD na podstawie wartości wartości dyskryminatora w samych product.id i product.product_type_id. Niezależnie od tego, czy planujesz używać ORM, czy nie, spójrz na połączoną dokumentację podklas Hibernate, choćby po to, aby zobaczyć podjęte przez nich decyzje projektowe.

product
=======

id INT
product_name VARCHAR
product_type_id INT -> Foreign key to product_type.product_type_id
valid_since DATETIME
valid_to DATETIME

magazine
========

id INT -> Foreign key to product.product_id
title VARCHAR
..

web_site
========

id INT -> Foreign key to product.product_id INT
name VARCHAR
..


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TIMEDIFF() Przykłady – MySQL

  2. tomcat7 — źródło danych jdbc — najprawdopodobniej spowoduje to wyciek pamięci

  3. nie można połączyć się z bazą danych mysql w Ubuntu

  4. Dlaczego użycie IN(...) podczas wybierania pól indeksowanych zabije wydajność zapytania SELECT?

  5. Data aktualizacji + rok w mysql