A полиморфная ассоциация похожа на внешний ключ или отношение многие-к-одному, с той разницей, что целью может быть один из нескольких типов (классы в языке, таблицы в дб).
Я портирую дизайн базы данных, который использовал уже несколько лет, с PHP на Java. В старом коде я развернул свой собственный ORM, который не был оптимальным по ряду причин. Хотя я мог бы начать настраивать вещи позже и, возможно, в конечном итоге сам реализовать их заново, сейчас я хотел бы использовать готовые ORM и JPA для моих классов сущностей.
Теперь в макете базы данных есть одна вещь, которую я не знаю, как выразить в JPA:
У меня есть таблица Node
и Edge
, в которой хранится график (DAG, если это имеет значение). Каждый узел может опционально ссылаться на один другой объект из базы данных. Эти энтиты могут повторяться по всему графику несколько раз, а также могут быть «осиротевшие» энтиты, которые не будут доступны для пользователя, но которые могут иметь смысл сохранять хотя бы некоторое время.
Эти объекты вообще не связаны с точки зрения наследования и т. Д., Но имеют естественную иерархию, аналогичную Customer-> Site-> Floor-> Room. Фактически, много лет назад я начал с полей внешнего ключа, указывающих на «родительские» объекты. Однако эта иерархия недостаточно гибкая и начала разваливаться.
Например, я хочу разрешить пользователям группировать объекты в папках, некоторые объекты могут иметь несколько «родителей», а также отношения со временем меняются. Мне нужно следить за тем, как раньше были отношения, поэтому с ними у графа есть промежуток времени, который указывает, когда и когда этот край был действительным.
Ссылка от узла к объекту хранится в двух столбцах таблицы узлов, один содержит идентификатор в чужой таблице, другой - его имя. Например (некоторые столбцы опущены):
table Node:
+--------+-------+----------+
| ixNode | ixRef | sRefType |
+--------+-------+----------+
| 1 | NULL | NULL | <-- this is what a "folder" would look like
| 2 | 17 | Source |
| 3 | 58 | Series | <-- there's seven types of related objects so far
+--------+-------+----------+
table Source (excerpt):
+----------+--------------------+
| ixSource | sName |
+----------+--------------------+
| 16 | 4th floor breaker |
| 17 | 5th floor breaker |
| 18 | 6th floor breaker |
+----------+--------------------+
Возможно, решение отличается от использования JPA. Я мог бы что-то изменить в макете таблицы или представить новую таблицу и т. Д. Однако я уже много думал об этом, и структура таблицы мне кажется нормальной. Может быть, есть и третий способ, о котором я не думал.