Несколько возможных отношений на столе - PullRequest
2 голосов
/ 21 декабря 2010

У меня есть таблица, которая содержит информацию об учетной записи для различных объектов в базе данных.В настоящее время дизайн таблицы выглядит примерно так:

CREATE TABLE account (id int(11) NOT NULL auto_increment,
                      account_id int(11) NOT NULL,
                      account_type varchar(15) NOT NULL,
                      balance decimal(12,2) NOT NULL,
                      PRIMARY KEY  (id))

Столбец account_id ссылается (без применения базы данных) на одну из 3 таблиц.Столбец account_type сообщает программисту, на какую таблицу ссылаться.Мне не нравится этот подход, потому что я не могу навязать отношения, и программисты могут случайно испортить данные.Я подумал сделать одно из следующего:

Добавление обнуляемого внешнего ключа для каждого типа или удаление столбца account_id и добавление таблицы перекрестных ссылок, чтобы связать учетную запись с сущностями.Столбец account_type будет использоваться для указания программистам, к какой таблице перекрестных ссылок обращаться.Есть ли другие варианты?Какова лучшая практика для чего-то подобного?

1 Ответ

2 голосов
/ 21 декабря 2010

Можно попробовать создать главную таблицу идентификаторов, из которой три таблицы общих идентификаторов получают свои первичные ключи.Ваша account таблица в вопросе будет тогда связана с главной таблицей.В общих чертах:

MasterIdentity
    Id (autoincrement)
    IdentityType (string, maybe FK to a type lookup table, whatever you want)

Table1
    Id (PK, FK to MasterIdentity)
    other data

Table2
    Id (PK, FK to MasterIdentity)
    other data

Table3
    Id (PK, FK to MasterIdentity)
    other data

Account
    Id (its own identifier as you already have)
    AccountID (FK to MasterIdentity)
    other data

Вставка в любую из трех таблиц будет включать вставку в MasterIdentity, получение значения идентификатора области из вставки и вставку в нужную таблицу, непосредственно указав идентификатор.(Конечно, все это должно быть атомарным в транзакции.) Обратите внимание, что идентификатор в этих трех таблицах не является значениями с автоматическим приращением, вы их предоставите.

Тогда любая таблица, к которой нужно обратитьсяк этим трем (я полагаю, неперекрывающимся) таблицам будет относиться одна таблица, к которой относятся идентификатор и тип, последняя из которых сообщает вам, какая подтаблица имеет остальные данные этой записи.

(Я почти уверен, что это называется отношением таблицы супертип / подтип, но точно сказать не могу.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...