#sql
#sql
Вопрос:
Я разрабатываю модель базы данных для приложения доставки.
У меня есть объект DeliveryWeek, который представляет одну неделю, и объект DeliveryDay, который представляет день недели (понедельник-пятница). Существует также объект DeliveryWeekDay, который объединяет DeliveryWeek и DeliveryDay в отношениях «многие ко многим».
Также существуют объекты DeliveryHour и DeliveryDayHour, которые объединяют DeliveryDay и DeliveryHour в отношениях «многие ко многим».
Для большинства недель часы доставки одинаковы, но в некоторых случаях (праздничная неделя) они могут отличаться.
Я хочу иметь возможность изменять часы доставки по умолчанию для всех новых недель доставки, но для некоторых недель доставки эти часы могут быть перезаписаны.
Должен ли я использовать две отдельные таблицы? Например, DefaultDeliveryHours для значений по умолчанию, и каждый раз, когда я создаю новую неделю доставки, я должен создавать новые записи DeliveryHour на основе данных DefaultDeliveryHour?
Комментарии:
1. Не могли бы вы, пожалуйста, привести нам пример ваших свойств в день доставки?
2. Я обновил описание
Ответ №1:
Я думаю, что есть два способа, которыми вы могли бы пойти:
Во-первых, без DeliveryWeekDay:
--------------- -------------
| DeliveryWeek| |DeliveryDay|
|-------------| |-----------|
|Year (PK) | |Id (PK) |
|Weeknr (PK) | |Weekday |
|MonId |---> |Properties |
|TueId |---> -------------
|WedId |--->
|ThuId |--->
|FriId |--->
---------------
С помощью идентификатора вы можете определить разные дни доставки с разными свойствами. Затем ваш код (program или sql trigger) должен убедиться, что MonId ссылается только на понедельник, будни и т.д. для других рабочих дней!
Второй вариант будет с таблицей отношений DeliveryWeekDay, которая выглядит следующим образом:
--------------- ----------------- -------------
| DeliveryWeek| |DeliveryWeekDay| |DeliveryDay|
|-------------| |---------------| |-----------|
|Year (PK) |<---|Year (PK/FK) |--->|Id (PK) |
|Weeknr (PK) | |Weeknr (PK(FK) | |Weekday |
--------------- |DDayId (PK/FK) | |Properties |
----------------- -------------
Здесь вы также должны убедиться, что ваш код (program vs sql trigger) гарантирует, что для каждой недели доставки в вашей таблице DeliveryWeekDay есть 5 записей (для каждого дня недели) — за исключением случаев, когда на этой неделе есть праздник.
В обоих случаях вы могли бы сделать DeliveryDay.Id = 1 по умолчанию и используйте другие значения id для ваших особых случаев.
Та же концепция применима к вашей таблице DeliveryHour. Пожалуйста, не используйте дополнительную таблицу по умолчанию, потому что это всего лишь избыточная таблица.
Комментарии:
1. Я уже направлялся ко второму подходу. Реальная проблема заключается в том, как сохранить значения DeliveryHour по умолчанию для понедельника, вторника, среды, четверга и пятницы.
Ответ №2:
Если я вас правильно понимаю, вы используете объект «DeliveryWeekDay» в качестве ссылки. Вы могли бы создать свой «DeliveryWeekDay» следующим образом: ID, DeliveryWeekID, DeliveryDayID, DeliveryHoursID, DefaultDayID, DefaultHoursID.
Итак, если «DeliveryDayID» равен нулю, вы возвращаете «DefaultDayID», а если «DeliveryHoursID» равен нулю, вы можете вернуть «DefaultHoursID». Предполагая, что вы выполняете запрос с помощью SQL:
SELECT ID,DeliveryWeekID,ISNULL(DeliveryDayID,DefaultDayID),ISNULL(DeliveryHoursID,DefaultHoursID)
Таким образом, вы можете иметь значение по умолчанию, но также изменять значение по умолчанию для некоторых записей.