2012-01-24 2 views
0

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

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

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

Вы можете выбрать схему, как это:

Warehouses 
    WarehouseId 
    Name 

WarehouseCities 
    WarehouseId 
    CityName 

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

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

EDIT: Чтобы быть ясным, все действующие города не присутствуют в таблице WarehouseGities. Возможно получение заказа для Города, не указанного в WarehouseCities. В таком случае мы должны иметь возможность выбрать резервный склад.

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

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


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

+0

Какая версия SQL Server? 2008? – EBarr

+0

Я удивлен, что это важно. Я надеялся избежать эзотерического решения, требующего определенной версии SQL Server; это не похоже на проблему, которая потребует исключительной функциональности. Тем не менее, это 2008. Я обновлю теги и вопрос. – Eric

+0

Мне любопытно проголосовать и закрыть голос. Лицо, которое меня помешало: вам не понравилось название или выяснили, что вопрос неясен? – Eric

ответ

4

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

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

заказ/Order_Item В терминах, как реализовать структуру в SQL, я буду считать, что все заказы грузят вне одного склада и что перевозка груз должен быть подвешен со стола заказов (но идеи должны быть применимы в других местах):

  • старший способ обеспечить ноль/один складами резервного копирования будет повесить Warehouse_Source записи в таблице «Заказы» и в поле «Исправлено» или «ShippingPriority» будет добавлен составной u nique index, который включает OrderID и IsPrimary/ShippingPriority.

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

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

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

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

+0

Мне нравится идея отфильтрованного индекса.Интуитивно, вероятно, уже имеет смысл, что существует только один первичный склад. Отфильтрованный индекс не кажется очень доступным для обнаружения, но я могу использовать его, чтобы помочь обеспечить что-то, что должно быть интуитивно понятным. Благодаря! – Eric

+0

Отфильтрованные индексы являются такими же доступными, как и более традиционные уникальные индексы (sp_helpindex MyTable) и открывают новые новые способы думать о D.R.I. – EBarr

0

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

WarehouseCities(*)...(1)Warehouses 

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

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

EDIT после комментарий

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

+0

Проблема, которую я плохо объяснил, заключается в том, что данный город не может присутствовать в таблице WarehouseGities. Я хочу решение, которое позволяет мне выбрать резервный склад, если город отсутствует в WarehouseGities. Я уточню свой вопрос, чтобы это было ясно. – Eric

0

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

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

+0

Резервный склад может иметь ассоциированные с ним города, но это не повлияет на использование столбца isFallback. Однако наличие столбца isFallback не гарантирует, что максимум один склад может быть помечен как резервный склад. – Eric

+0

Затем, как вы сказали, вы можете создать другую таблицу с вашим резервным идентификатором склада и принудительно выполнить RI. Это похоже на излишний, и это может быть, но оно удовлетворяет вашим требованиям. Я не думаю, что вы здесь ничего не пропустили. – Beth

+0

Достаточно честный. Благодаря! – Eric

Смежные вопросы