Mysql
 sql >> база данни >  >> RDS >> Mysql

Правилно внедряване на подтип супер тип в MySQL

Масата "парти" не изглежда правилно. Сравнете с изходния код от този друг въпрос SO .

В този вид структура идентификационният номер на партията се разпространява надолу, така да се каже. Обикновено трябва да бъде или първичен ключ, или външен ключ в таблици, които съхраняват данни за дадено лице.

Във вашата таблица "отчитане" изглежда, че първичният ключ не трябва да бъде "partyid". Това би позволило само един ред на служител, което не мисля, че сте възнамерявали. (Може и да греша.) Ако съм прав за това, може да помислите за NOT NULL UNIQUE ограничение за {partyid, date} и PRIMARY KEY ограничение за нова колона, 'reportid'. Таблиците "travel" и "performance" вероятно ще се отнасят към "reportid". (Но продължете да четете.)

Във вашата диаграма има места, където дадено лице получава допълнителен ключ:вашата компания присвоява уникален идентификационен номер на служител на своите служители, например. Няма теоретична причина да не можете да използвате „employid“ вместо „partyid“ от този момент нататък, за да препоръчате служители. Но има практическа причина, поради която може да не искате да направите това. Увеличава броя на присъединяванията.

Например, ако таблиците „credential“, „tool“, „certification“, „academic“ и „compliance“ посочват employee.employid вместо employee.partyid, не можете просто да присъедините „compliance“ и „party“ към вземете името на човека. Ще трябва да се присъедините и към „служител“.

Те трябва да имат първичен ключ; първичният ключ не е задължително да е идентификационен номер. Ако има съществуващ естествен ключ, трябва да го идентифицирате и да го декларирате за УНИКАЛЕН така или иначе.

Таблицата "поръчки" вероятно трябва да има само "orderid" като първичен ключ; използвайте препратка към външен ключ, за да идентифицирате клиента. В някои случаи има смисъл да преименувате колони. В случая с клиенти може да има смисъл да се нарече неговия ключ „customerid“ вместо „parytid“. Аз лично бих създал домейн.

create domain PARTY_ID as integer not null;

Тогава, навсякъде, където се нуждаеше от идентификационен номер на партия, бих използвал домейна вместо това.

create table customers (
    customerid PARTY_ID primary key references parties (partyid),
...

Бих предпочел да видя и маса с мениджъри. Позоваването на него би гарантирало, че manager.managerid ще се разреши към действителен мениджър, а не само към всеки служител.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 500 Вътрешна грешка на сървъра?

  2. Mysql Съхранение на променлива с резултат от SELECT CASE

  3. Използване на Order By в codeigniter

  4. Perl:Актуализирайте няколко реда с едно извикване на MySQL

  5. Използване на MySQL LIKE оператор за полета, кодирани в JSON