Рассмотрим ситуацию, когда я определить объект, группу объектов, затем таблицу, которая связывает их вместе:Внешний ключ к таблице А или В
CREATE TABLE obj (
id INTEGER PRIMARY KEY,
name text
) ;
CREATE TABLE group (
id INTEGER PRIMARY KEY ;
grpname TEXT
) ;
CREATE TABLE relation (
objid INTEGER,
grpid INTEGER,
PRIMARY KEY (objid, grpid)
) ;
Я ищу каскадное удаление, когда это применимо, так что я добавить внешний ключ
ALTER TABLE relation
ADD FOREIGN KEY (objid)
REFERENCES obj(id)
ON DELETE CASCADE ;
ALTER TABLE relation
ADD FOREIGN KEY (grpid)
REFERENCES group(id)
ON DELETE CASCADE ;
Пока все в порядке. Теперь предположим, что хочу добавить поддержку для группы групп. Я имею в виду, чтобы изменить таблицу отношение так:
CREATE TABLE relation_ver1 (
parent INTEGER,
child INTEGER,
PRIMARY KEY (parent, child)
) ;
ALTER TABLE relation_ver1
ADD FOREIGN KEY (parent)
REFERENCES group(id)
ON DELETE CASCADE ;
Здесь я получаю вопрос: Я хотел бы применить каскадное удаление для ребенка, но я не знаю, здесь, если ребенок относится к группе или объекту ,
Можно ли добавить внешний ключ в таблицу obj или группу?
Единственное решение, которое я нашел, - это добавление полей child_obj и child_grp, добавление относительных внешних ключей, а затем при вставке, например, в объект используется специальная (тип нулевой) группы и обратная операция, когда вставка подгруппы.
Ваше требование несовместимо с понятием «ключа» в теории отношений. решение, о котором вы упомянули, уже хорошо, я думаю. – ultrajohn
Любые намеки на суррогаты? @ultrajohn – marom
, чтобы предотвратить разреженность ваших данных в таблице relation_ver1, я предлагаю вам отделить случай, когда дочерний объект является объектом, а ребенок - группой в свои собственные таблицы. – ultrajohn