|
|
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть БД из трех таблиц: Код: sql 1. 2. 3. Для всех таблиц id - суррогатный первичный ключ. В таблице T3 ref_id ссылается на поля id таблицы T1 или T2. ref_type - обозначает, на какую именно таблицу ссылается ref_id. При этом T1 и Т2 отражают сущности предметной области, их тип (на который ссылается Т3.ref_type) известен только на уровне приложения, в таблицах (Т1, Т2) он не хранится. Т3 - не является сущностью, это своего рода результат деятельности. Пример: простейший учет невыходов на работу. Пусть Т1 отражает прогулы, Т2 - больничные. Пусть они оба содержат дату начала и окончания события, а в таблицу Т3 пишут количество дней прогула/больничного. Тогда Т3 позволит получить общее количество дней отсутствия на работе. Вопросы: Можно ли такое поведение (получение сущностей Т1 и Т2 с коллекциями их записей из Т3 ) замапить аннотациями JPA/Hibernate? Какая альтернатива может быть такой схеме при условии сохранения функционала? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:21:56 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
странная у вас и не нормализованая структура. но она легко исправляется введением дополнительноый таблицы T4 для хранения всех PK. T1 и T2 имеют PK, который так же является FK на T4. T3 ссылается на T4. Таким образом на ref_id можно смело навесить FK constraint. Таким образом вы получите целостную структуру, которую сложно сломать, благодаря сильным FK констрейнтам. Мапиться это всё в Hibernate через наследование и MappedSuperclass. Надо вообще точнее посмотреть способы маппинга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:31:49 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, большое спасибо за ответ. О таком варианте я думал, в итоге я получу Т3 с FK на Т4 через ref_id, без использования doc_id. То есть фактически, буду иметь возможность по ссылке на экземпляр Т1 или Т2 вытянуть все связанные с ними записи из Т3. Это очень хорошо. Но, я буду лишен возможности анализировать саму Т3 на предмет того, к какому типу относятся записи в ней. Я не смогу сказать - эти записи класса Т2, вот эти - класса Т1. Или, на моем примере, не смогу отделить больничные от прогулов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:52:22 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapeckerBlazkowicz, большое спасибо за ответ. О таком варианте я думал, в итоге я получу Т3 с FK на Т4 через ref_id, без использования doc_id. То есть фактически, буду иметь возможность по ссылке на экземпляр Т1 или Т2 вытянуть все связанные с ними записи из Т3. Это очень хорошо. Но, я буду лишен возможности анализировать саму Т3 на предмет того, к какому типу относятся записи в ней. Я не смогу сказать - эти записи класса Т2, вот эти - класса Т1. Или, на моем примере, не смогу отделить больничные от прогулов. В вашем случае ref_id может ссылаться на "прогул", в то время как ref_type будет "говорить" что это больничный. Кому вы будете верить в этой ситуации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 12:55:38 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, согласен на все сто процентов, в моем случае сама база данных никак не в состоянии проконтролировать, что ref_id будет именно того типа, который мне нужен, поэтому эту ответственность придется переложить на уровень приложения. Только как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:00:34 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Можно сделать эту колонку вычислимой так чтобы база ещё и кешировала значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:04:09 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:08:39 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapeckerПусть Т1 отражает прогулы, Т2 - больничные. Пусть они оба содержат дату начала и окончания события, а в таблицу Т3 пишут количество дней прогула/больничного. Тогда Т3 позволит получить общее количество дней отсутствия на работе. А зачем делать необычные связи? У вас задача на нобелевскую? Если через типы, то тогда ОднаТаблица(ТипСобытия, ДатаНачала, ДатаОкончания) Всё остальное вычисляется. А вообще лучше от Сущности Документ идти - Приказ-О-прогуле и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:14:40 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapeckerBlazkowicz, как это сделать? Спросите в профильных форумах. У вас, вероятно, та самая единственная SQL база данных, которая без вариантов. Да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:18:08 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Petro123, с одной таблицей я не выкручусь. Даже если пойду от сущности "Документ". Их может быть не 2 а 20, и все с разными полями, общие у них конечно будут, типа дата документа, комментарий, еще что-нибудь в этом духе. А относиться они могут при этом к одной области, и вычислять значения, которые мне нужно хранить в Т3 как им вздумается. Их объединяет не общая структура, а общий результат - который мне нужно хранить в Т3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:22:00 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, у меня база с вариантами. Я ищу вариант, с которым мне будет удобнее работать, и который можно будет безболезненно расширить при появлении новых сущностей типа Т1 и Т2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:25:15 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapecker, ну дак нужно идти от простого к сложному. А не наоборот. - вы привели вверху ТЗ на одну таблицу, а теперь говорите о 20 ТИПАХ документов. Просто, есть 2 варианта проектирования: - от ОРМ - Начинать с классов и хорошо ложится на Хибер - от СУБД - Начинать с табличек РСУБД. Схема БД УЖЕ есть. У вас какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:29:41 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapeckerBlazkowicz, у меня база с вариантами. Я ищу вариант, с которым мне будет удобнее работать, и который можно будет безболезненно расширить при появлении новых сущностей типа Т1 и Т2 понятно. Появление НОВОЙ СУЩНОСТИ в динамике после создания ИС - самое неблагодарное дело. Это конструктор-фреймворк-ядро. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:31:37 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapecker, давайте попробуем с другой строны. Диаграмму классов для вашего случая. А хранилище потом. Напишите классы. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:33:40 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Petro123, у меня от базы. От базы, которой еще нет. В моей предметной области происходят события, эти события регистрируются документами. То есть как минимум у меня будет по одной таблице на каждый вид регистрируемого события. Делать одну таблицу с типом события не могу, потому что у документов может быть сильно разная структура. Кроме собственно регистрации события, на основании данных документа будут произведены некоторые вычисления, и результаты вычислений мне нужно будет хранить в еще одной таблице. При этом туда свои вычисления могут складывать разные документы. Сколько их будет, я пока не знаю. Поэтому мне нужна ссылка на документ и на его тип в этой таблице. Еще один важный момент. Я хочу иметь возможность включать/выключать отражение вычислений документа. То есть его родную таблицу не трогаю, но при необходимости удаляю/записываю его вычисления в таблицу результатов вычислений. Отчеты я буду строить по таблице результатов, и никогда не буду трогать сами таблицы документов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 13:40:55 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapecker, ну. А я ни разу не против. - лучше идти не читсо от БД, а параллельно писать классы. Ты ведь с Хибером дружить хочешь? А его цель - классы. - всё таки Первичен - ДОКУМЕНТ и он порождает событие? Тогда аналогия 1С. Приведи пример реальный. - кто добавляет НОВЫЙ тип документа - Пользователь? Тогда должен быть класс - Менеджер документов. - т.е. тип ИС - ДокументоОриентированная или Учётная? и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 14:19:24 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Если, а-ля 1С. То примерно так и будет. Типы Документов. У них в полях значения. На кнопку - Провести - пишут в T3. На кнопку Убрать проведение - очищают её от себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 14:21:21 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Petro123, первичен документ, эта идея именно из 1С, уж очень мне понравились их мысли по поводу регистров сведений/накопления. С хибером дружить хочу, попробовал зайти со стороны классов. То есть позволить хиберу создать схему базы данных по моим аннотированным классам (Документы разные - то что они навычисляли имеет одинаковый формат). Вот классы (геттеры, сеттеры, методы опущены): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. По такому определению хибер генерирует схему, привязывая каждый Doc к Reg через вспомогательную таблицу. На уровне классов я конечно могу найти соответствие между doc и его Reg. Но отчеты я буду строить не вытаскивая из базы каждую строчку в новый объект, а обычными запросами и обработкой результата. И там опять же я не имею в таблице Reg ссылки на тип документа, который породил запись. В одинэсе такая возможность есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 15:02:16 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapecker, это замечательно, что ты так быстро и наглядно всё провернул. А вот идею с reg я не просекаю. Тут надо к 1С никам. 1. По мне проще что у тебя было. 2. Тебя устраивает, что приновом DOC2 тебе нужно будет апгрейдить систему. Т.е. это делает не заказчик. Т.к. слишком быстро ты всё на свою табличку фактов идёшь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 15:08:18 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Petro123, тут еще идеологический вопрос. Все-таки документы (Т1,Т2 или Doc1, Doc2) это сущности, а их результаты (T3, Reg) - нет. А по классам получается что сущности и те и другие. Может у хибернейта есть что-нибудь на этот счет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 15:09:39 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapecker, Сущность - это объект значимый для бизнеса. Т.е. строка в Т3 - вполне ей может быть (как объект-"Событие") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 15:24:21 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
можно не делать сущностями, но тогда это как раз твоя схема выше и дописать процедуры - "Провести" "УбратьПровести" - руками. Т.е. это будет Сервисный слой бизнес-логики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2012, 15:26:27 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, подумал присмотреться к этому поближе:авторстранная у вас и не нормализованая структура. но она легко исправляется введением дополнительноый таблицы T4 для хранения всех PK. T1 и T2 имеют PK, который так же является FK на T4. T3 ссылается на T4. Таким образом на ref_id можно смело навесить FK constraint. Таким образом вы получите целостную структуру, которую сложно сломать, благодаря сильным FK констрейнтам. В этом случае констрейнты слишком сильные, или я чего-то недопонял. Если у Т4 (doc_reg на схеме) будут FK и на T1(Doc1) и на T2(Doc2), то в нее можно будет писать только Id, которые есть сразу в обеих таблицах T1 и T2. То есть если у меня в T1 есть айди (1,2,3) а в T2(4,5,6), то я не смогу в T4 записать ни то ни другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 10:47:59 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
javapeckerВ этом случае констрейнты слишком сильные, или я чего-то недопонял. Если у Т4 (doc_reg на схеме) будут FK и на T1(Doc1) и на T2(Doc2) Если бы так можно было, то не нужна была бы дополнительная таблица. Обошлись бы тремя как в вашем первом варианте. FK должен быть с другой стороны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 10:51:00 |
|
||
|
Hibernate: Необычные связи. Можно и нужно ли так делать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я в таком случае совершенно запутался. Если FK должен быть с другой стороны, то doc_id В Т4(doc_reg) должно быть уникально, а оно не может, потому что Т1 и Т2 могут быть одинаковые идентификаторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 10:55:57 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37889297&tid=2131298]: |
0ms |
get settings: |
13ms |
get forum list: |
29ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
73ms |
get topic data: |
24ms |
get forum data: |
6ms |
get page messages: |
104ms |
get tp. blocked users: |
2ms |
| others: | 319ms |
| total: | 584ms |

| 0 / 0 |
