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

#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)
  

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