2012-01-23 2 views
0

У меня есть две таблицы, которые моделируют отношения наследования. Это выражается ограничением внешнего ключа на Derived.Id, ссылающимся на Base.Id. Некоторые столбцы в Base по существу дублируются в Derived, поэтому они могут ссылаться на уникальные ограничения и сложные внешние ключи. Я бы хотел, чтобы значения для этих столбцов были одинаковыми в обеих таблицах. В идеале это будет сделано с помощью сложного внешнего ключа на Id + столбце. Но это предотвращает изменение значений - это сценарий catch-22.Дублирующие столбцы в модели наследования

Как я могу обеспечить, чтобы эти столбцы имели одинаковые значения в обеих таблицах и позволяют им обновляться? У меня есть полная гибкость, поэтому я могу изменить схемы таблиц или сделать все, что нужно, чтобы сделать это возможным.

ответ

0

Я бы сохранил только столбцы в одной из таблиц, base, если это применимо ко всем объектам. Можете ли вы привести пример необходимости дублирования столбцов с конкретным примером, например base = car, имеет VIN, производный = myCar, имеет VIN.

Кроме того, если дублированные столбцы являются частью ключей, используйте каскадное обновление.

+0

В качестве примера у всех 'Base' есть' Category'. Но 'Category' должен находиться в' Derived', чтобы установить уникальное ограничение на 'Category' +' Name' (которое находится только в 'Derived'). Что касается каскадных обновлений, к сожалению, это не соответствует требованиям ORM, которые я должен использовать. – Daniel

+0

Когда я делал подобное в прошлом, у меня только что была категория в базовой таблице и у меня было уникальное ограничение на поле имени, так как производная таблица содержала только одну категорию, так как каждая категория имела разные столбцы. – Beth

+0

Фактически, если каждая производная категория имеет имя (или что-то еще), вы можете сохранить это в базовой таблице. – Beth

0

Вместо того, чтобы иметь 2-ую таблицу, я бы просто имел все столбцы Derived в таблице Base и установил для этих столбцов значение NULL. Если вы также добавите столбец дискриминатора, чтобы определить, представляет ли конкретная запись объект Base или объект Derived, вы все настроены.

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

+0

Что делать, если вы хотите, чтобы таблица ссылалась на 'Derived' в отношении ограничения внешнего ключа? Вы не можете сделать это с помощью отдельной таблицы + дискриминатора. – Daniel

+0

Если вы имеете в виду, что вам нужен другой объект, чтобы иметь право на «Derived», а не только на «Base», вы можете сделать это несколькими различными способами. Один из способов состоит в том, чтобы один из столбцов «Derived» был столбцом идентификатора, отделенным от столбца «Идентификатор базы», ​​с ограничением уникальности на нем и отключением FK. Другой вариант - отключить FK от «Base» PK и дополнительного поля «Derived». – cdeszaq

+0

Ваше последнее предложение - это «слабая гарантия», на мой взгляд, потому что, если поле 'Derived'-only 'равно null, ограничение не будет применяться. – Daniel

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