2012-07-11 3 views
2

Предполагая, что это представление таблиц:Каков наилучший способ представления полиморфных ассоциаций в реляционной базе данных?

db parent/child tables

Объект является «родителем» таблица, которая держит ObjectIds всех остальных 4-х дочерних таблиц.
Стол «что-то», помимо столбца objectid, также будет содержать столбец linked_to_objectid. Этот столбец указывает только на objectid от object1 и object2 (а не от объекта 3).

Моя проблема заключается в том, что я буду проверять каждый раз, когда я вставляю строку, если связанный_to_objectid не из объекта3.

Другим способом было бы добавить еще один столбец в таблицу объектов, который будет описывать, какой тип объекта является объективом ... Но я чувствую, что это было бы неправильно.

Я знаю, что эта модель нарушает правила нормальной формы, но я не могу найти другие способы.
Кто-нибудь может мне помочь и найти лучший способ смоделировать это?

ответ

4

Я думаю, ваш ответ использовать взаимные первичные/внешние ключи и перегородки часть первичного ключа среди таблиц, что-то вроде:

CREATE TABLE object_class (
    id int not null unique, -- hand assigned 
    label text not null primary key 
); 

CREATE TABLE object (
    object_id bigserial not null primary key, 
    class_id int not null references object_class(id), 
    ...., 
    UNIQUE (object_id, class_id) 
); 

CREATE TABLE object1 (
     object_id bigint not null, 
     class_id bigint not null, 
     ..... 
     check(class_id = 1), 
     primary key (object_id, class_id), 
     foreign key (object_id, class_id) references object(object_id, class_id) 
); 

etc. 

Теперь, если вы используете PostgreSQL, вы, вероятно, можно использовать наследование таблицы и триггеры ограничения для реализации чего-то более чистого, но это относительно продвинутый материал.

+1

Это ночной способ добавить триггеры, чтобы сохранить целостность db. Это просто ночная жизнь для реализации оо-концепций в rdbms. Это можно сделать, но не эффективно. Мне не нравится хранить метаданные о таблицах в другой таблице (например, ваш класс объектов). Во всяком случае, я сохранил это просто, только суперсетевая таблица объектов, в которой хранятся все идентификаторы для всех записей таблиц. Отброшено все триггеры (слишком много указаний, сделанных вручную для удаления/обновления/вставки). Сделал несколько дополнительных таблиц ассоциации, если мне нужна некоторая обратная запись. В любом случае лучшим решением было бы oodb :). – Tudor

+0

P.S. +1 ваш ответ хорош, но не может принять его, потому что на вопрос можно ответить по-разному в зависимости от потребностей some1. И полный ответ не будет слишком эффективным. Многие, возможно, скажут, что уходят. :) – Tudor

+0

@TudorTudor Meh, только десять лет назад PostgreSQL получил декларативную ссылочную целостность. Я выполняю несколько триггеров для обеспечения RI, и это не так уж плохо. В любом случае DRI доставит вам большую часть пути. –

Смежные вопросы