Составной ключ GORM на основе дат начала и окончания

#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 переменные, которые содержат начальную и конечную дату текущего диапазона. Таким образом, мы смогли сохранить желаемую функциональность, и она работает действительно хорошо.