Как мне создать (тип, ID) (иначе «полиморфный») - столбец внешнего ключа в MS Access? - PullRequest
4 голосов
/ 30 сентября 2008

В Ruby-on-Rails это называется «полиморфная ассоциация».

У меня есть несколько Commentable вещей в моей заявке, таблицы для каждой из них ниже:

Post
id | title | text | author (FK:Person.id) | ...

Person
id | name | ...

Photo
id | title | owner (FK:Person.id) | path | ...

Я хотел бы добавить таблицу Comments следующим образом:

Comments
id | commentable_type | commentable_id | text | author (FK:Person.id)

Я понимаю, что таким образом теряю ссылочную целостность базы данных, но единственный другой вариант - иметь несколько таблиц Comments: PostComments, PersonComments, PhotoComments, ...

А теперь на вопрос:

Как мне создать форму, которая будет искать способ поиска, сначала получая имя таблицы из Comments.commentable_type, а затем идентификатор из Comments.commentable_id?

Ответы [ 2 ]

4 голосов
/ 01 октября 2008

Этот метод известен в мире SQL как «подклассы». Рабочий пример (синтаксис SQL Server, но его легко адаптировать для MS Access) см. В блоге Дэвида Порта. .

В вашем сценарии элементы данных, общие для всех комментариев, будут находиться в вашей таблице комментариев; что-нибудь определенное для каждого типа будет в специализированных таблицах, таких как PhotoComments и т. д. Обратите внимание, что FK должен представлять собой соединение из двух столбцов идентификатора плюс тип, что часто упускается из виду, но здесь важно для ссылочной целостности, например Вы не хотите, чтобы в таблице PersonComments появлялись комментарии в виде комментариев к фотографиям.

0 голосов
/ 30 сентября 2008

Я считаю, что многие люди создают мета-таблицы для такого рода вещей. Примерно так, как вы это описали.

...