Указание основной записи / записи по умолчанию в базе данных - PullRequest
0 голосов
/ 24 января 2012

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

Предположим, вы создаете очень простое приложение для доставки.Вы будете принимать заказы и должны будете решить, с какого склада их отгружать.

Допустим, у вас есть несколько городов, у которых есть свои собственные специализированные склады *;если заказ поступит из одного из этих городов, вы отправите его со склада этого города.Если заказ поступает из любого другого города, вы хотите отправить его с определенного другого склада.Этот другой склад мы назовем резервным складом.

Вы можете выбрать схему, подобную этой:

Warehouses
    WarehouseId
    Name

WarehouseCities
    WarehouseId
    CityName

В решении должно быть задействовано ноль или один запасной склад.

Вам нужен способ указать, какой склад следует использовать, если для данного города не указано ни одного склада.Если это действительно имеет значение, вы делаете это на SQL Server 2008.

РЕДАКТИРОВАТЬ: Для ясности, все действительные города НЕ присутствуют в таблице WarehouseCities .Можно получить заказ для города, не указанного в WarehouseCities.В таком случае нам нужно иметь возможность выбрать запасной склад.

Если бы было разрешено любое количество хранилищ по умолчанию или если бы я назначал склады по умолчанию, скажем, состояниям, я бы использовал таблицу DefaultWarehouse,Я мог бы использовать такую ​​таблицу здесь, но мне нужно было бы ограничить ее ровно одной строкой, что кажется неправильным.

Как бы вы указали запасной склад?


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

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Я понимаю вашу проблему, но у меня есть вопросы по ее частям, поэтому я буду немного более общим.

  • Если это вообще возможно, я буду хранить данные хранилища / резервного хранилища вместе с вашим инвентаремданные (либо непосредственное зависание складов, либо, если это зависит от конкретного продукта от таблиц инвентаризации).
  • Если настройку необходимо рассчитывать с помощью вашей бизнес-логики, то записи должны зависать от таблицы order / order_item

С точки зрения того, как реализовать структуру в SQL, я предполагаю, что все заказы отправляются с одного склада и что отгрузка должна быть перенесена из таблицы заказов (но идеи должны быть применимы в другом месте):

  • Более старый способ принудительного использования хранилищ с нулевым / единичным резервным хранилищем - это повесить запись Warehouse_Source таблицы Orders и включить поле «IsPrimary» или «ShippingPriority», а затем включить составной уникальный индекс.это включает OrderID и IsPrimary / ShippingPriority.

  • если у вас когда-либо будет только один резервный склад, вы можете добавить в заказ поля ShippingSource_WareHouseID и ShippingSource_Backup_WareHouseID.Хотя это не тот путь, по которому я бы пошел.

В SQL 2008 и выше у нас есть замечательное добавление Фильтрованные индексы .Это позволяет вам добавить предложение WHERE к вашему индексу, что приведет к более компактному индексу.Это также имеет дополнительное преимущество, позволяя вам выполнять некоторые вещи, которые могли быть выполнены только с помощью триггеров в прошлом.

  • Вы можете поместить уникальный отфильтрованный индекс в OrderID и IsPrimary / ShippingPriority (WHERE IsPrimary = 0).

Добавить комментарий или другое, если вы хотите, чтобы я объяснил более подробно.

0 голосов
/ 24 января 2012

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

использовать другой столбец isFallback, содержащий двоичное значение. Я предполагаю, что у вашего запасного склада не будет городов, связанных с ним.

0 голосов
/ 24 января 2012

Как я понимаю, резервный склад в конце концов - это просто еще один склад, и, если я понял, каждая запись в WarehouseCities имеет ссылку на одну запись в Warehouses:

WarehouseCities(*)...(1)Warehouses 

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

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

РЕДАКТИРОВАТЬ после комментария

Предполагая, что есть только один резервный склад для городов, отсутствующих в WarehouseCities, я предлагаю оставить резервный склад как просто другой склад и сохранить его Id (WarehouseId) в качестве параметра приложения (может быть, таблица для параметров?), Конечно, это решение программно и не привязано к вашей платформе базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...