Конструкции вы описываете называются эксклюзивные дугами. Да, это довольно хрупкий дизайн и даже не справляется с некоторыми нормами нормализации.
Вот альтернатива:
Main_Table
id UNIQUEIDENTIFIER
t_id INT NOT NULL
FOREIGN KEY (t_id) REFERENCES T0 (id)
T0
id UNIQUEIDENTIFIER
type INT NOT NULL CHECK (type IN (1,2,3))
UNIQUE KEY (id, type)
T1
id INT
type INT NOT NULL CHECK (type = 1)
name VARCHAR(255)
FOREIGN KEY (id, type) REFERENCES T0 (id, type)
T2
id INT
type INT NOT NULL CHECK (type = 2)
name VARCHAR(255)
FOREIGN KEY (id, type) REFERENCES T0 (id, type)
T3
id INT
type INT NOT NULL CHECK (type = 3)
name VARCHAR(255)
FOREIGN KEY (id, type) REFERENCES T0 (id, type)
С помощью этой конструкции, каждая строка в Main_Table
должна ссылаться на одну строку в T0
.
Аналогично, каждая строка в T0
может быть родительской только одной строкой в T1
, T2
, или T3
.
Это способ реализации классов наследования классов и полиморфных ассоциаций без нарушения ссылочной целостности.
Main_Table пытается быть плательщиком таблицу, которая может ссылаться либо отдельного пользователя (T1), группа индивидуальных пользователей (Т2), или группу групп (T3) ,
Правильно, поэтому подумайте об этом с точки зрения объектно-ориентированного дизайна. Если у вас было три класса, которые могли бы функционировать в качестве получателя платежей, вы бы создали интерфейс под названием Payable
или что-то в этом роде, чтобы каждый мог положиться на ввод этих объектов. Все объекты Payable
должны иметь, например, метод sendPayment()
. В некоторых языках OO интерфейс является суперклассом и называется абстрактным классом или чистым виртуальным классом.
В T0
табличных функций в качестве общего типа для каждого из дочерних таблиц T1
, T2
и T3
. Когда Main_Table
имеет внешний ключ до T0
, это похоже на то, что Main_Table
должен иметь ссылку на какой-либо объект, который равен Payable
, но любой объект, сходящий с этого суперкласса, в порядке.
Столбец type
- это всего лишь трюк, чтобы удостовериться, что данный T0.id
может ссылаться только на одну таблицу подкласса за раз. Это необязательно, если вы можете полагаться на свою логику приложения, чтобы вставить данную дочернюю строку только в одну из таблиц подкласса.
Также смотрите раздел полиморфных ассоциаций в моей презентации "SQL Antipatterns Strike Back".
Это пахнет плохим дизайном. Можете ли вы быть более осведомлены о том, что такое данные и почему вы хотите связать их таким образом? – spender
Похоже, вы пытаетесь создать условный внешний ключ. Как упоминалось выше, ощущение того, что вы пытаетесь достичь, поможет нам определить наилучший подход. –