Как создать столбец внешнего ключа (Тип, ID) (он же «полиморфный») в MS Access?
Вопрос
В 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
?
Решение
Этот метод в просторечии известен в мире SQL как «подклассинг».Рабочий пример (синтаксис SQL Server, но легко адаптируемый для MS Access) см. Блог Дэвида Порты..
В вашем сценарии элементы данных, общие для всех комментариев, будут находиться в вашей таблице комментариев;все, что относится к каждому типу, будет находиться в специализированных таблицах, таких как PhotoComments и т. д.Обратите внимание, что FK должен состоять из двух столбцов идентификатора и типа, что часто упускается из виду, но здесь важно для ссылочной целостности, например.вы не хотите, чтобы что-то, напечатанное как комментарий к фотографии, отображалось в таблице PersonComments.
Другие советы
Я считаю, что многие люди создают метатаблицы для подобных вещей.Примерно так, как вы описали.