#hibernate #grails #grails-orm #relationship #composite-key
#гибернация #grails #grails-orm #взаимосвязь #составной ключ
Вопрос:
Я хочу иметь таблицу, в которой я хочу иметь записи с диапазоном дат. Как я обычно это делал, должна была иметь таблицу с: someId [не уникальный] StartDate EndDate
Эти три создадут первичный ключ я бы добавил несколько ограничений, чтобы убедиться, что даты не перекрываются и т.д.
С точки зрения базы данных все в порядке, однако, когда я хочу создать класс домена в Grails для его обработки… ну, это сложнее, чем я думал. Есть ли способ убедиться, что если у меня есть отношение: ClassA имеет один ClassB [ClassB будет в диапазоне дат], и у меня есть записи в ClassB:
Id StartDate EndDate Name
1 2011-11-01 2011-11-05 A
1 2011-11-06 2011-11-10 B
и присвоить ObjectB с именем A объекту 2011-11-03, а затем получить ObjectA в 2011-11-07, он будет указывать на ObjectB с именем B?
Ответ №1:
Это кажется плохим способом проектирования вашей базы данных. В большинстве случаев вам действительно следует просто использовать один числовой идентификатор для объектов.
Если вы имеете дело с ситуацией, когда у вас есть несколько диапазонов дат, связанных с одним и тем же объектом, то вам следует структурировать свои данные таким образом, чтобы представлять это, имея родительский объект и дочерний объект, который представляет список диапазонов дат.
class Foo {
static hasMany = [bars:Bar]
static mapping = {
bars lazy:false
}
...
}
class Bar {
static belongsTo = [foo:Foo]
Date startDate
Date endDate
...
}
Grails упрощает каскадное удаление, поэтому нет реальной причины не создавать его таким образом.
Комментарии:
1. Спасибо за ответ, но это не решение. Мне все равно пришлось бы выполнять поиск каждый раз, когда я хочу получить доступ к данным. Я не могу использовать простой findBy … поскольку в моем случае between не будет работать, я должен выполнить поисковый запрос по критериям, иначе мне пришлось бы сначала найти Foo, а затем искать Bar . По моему опыту, составной ключ всегда был быстрее, чем многократный выбор по нескольким таблицам [или объединение двух таблиц].
Ответ №2:
В итоге мы сделали следующее: создали индекс и ограничение для трех столбцов [в базе данных, поскольку создание индексов в Grails 1.3.7 нарушено, а обработка ограничений безумна], создали статические startDate
и endDate
переменные, которые содержат начальную и конечную дату текущего диапазона. Таким образом, мы смогли сохранить желаемую функциональность, и она работает действительно хорошо.