指示数据库中的主要/默认记录

时间:2012-01-24 01:51:35

标签: sql-server database sql-server-2008

我一直在努力应该如何表明数据库中的某条记录是“后备”或默认条目。我一直在努力解决如何将问题简化为简单的问题陈述。我将不得不提供一个例子。

假设您正在构建一个非常简单的运送应用程序。您将接受订单,并需要决定从哪个仓库发货。

假设你有几个城市拥有自己的专用仓库*;如果订单来自其中一个城市,您将从该城市的仓库发货。如果订单来自任何其他城市,您希望从某个其他仓库发货。我们称某个其他仓库为后备仓库。

您可以决定这样的架构:

Warehouses
    WarehouseId
    Name

WarehouseCities
    WarehouseId
    CityName

解决方案必须强制执行零个或一个后备仓库。

如果没有为相关城市指定仓库,您需要一种方法来指明应该使用哪个仓库。如果它真的很重要,那么你就是在SQL Server 2008上这样做了。

编辑:要清楚,所有有效城市都不在WarehouseCities表中。对于未在WarehouseCities中列出的城市,可能会收到订单。在这种情况下,我们需要能够选择后备仓库。

如果允许任意数量的默认仓库,或者我将默认仓库分配给,例如,状态,我会使用DefaultWarehouse表。我可以在这里使用这样的表,但我需要将它限制为恰好一行,这感觉不对。

您如何表明后备仓库?


*当然,在这个例子中,我们忽略了可能存在多个同名城市的可能性。您正在构建此应用程序的国家/地区严格对所有城市名称强制执行唯一性约束。

3 个答案:

答案 0 :(得分:4)

我理解你的问题,但对部分内容有疑问,所以我会更加一般。

  • 如果可能的话,我会将仓库/备份仓库数据与您的库存数据一起存储(直接挂起仓库,或者如果产品特定于库存表之外)。
  • 如果必须通过您的业务逻辑计算设置,那么记录应该挂起订单/ order_item表

关于如何在SQL中实现结构,我将假设所有订单都从单个仓库发货,并且必须将订单挂在订单表上(但这些想法应该适用于其他地方):

  • 执行零/一备份仓库的旧方法是挂起Orders表的Warehouse_Source记录并包含“IsPrimary”字段或“ShippingPriority”,然后包含一个包含OrderID和IsPrimary /的复合唯一索引ShippingPriority。

  • 如果您只有一个备份仓库,则可以将OrderSource_WareHouseID和ShippingSource_Backup_WareHouseID字段添加到订单中。虽然,这不是我想去的路线。

在SQL 2008及更高版本中,我们添加了Filtered Indexes。这些允许您向索引添加WHERE子句 - 从而产生更紧凑的索引。它还具有额外的好处,允许您完成一些只能通过过去的触发器完成的事情。

  • 您可以在OrderID&上添加唯一过滤索引。 IsPrimary / ShippingPriority(WHERE IsPrimary = 0)。

如果您希望我进一步解释,请添加评论等。

答案 1 :(得分:0)

正如我所看到的,后备仓库毕竟只是另一个仓库,如果我理解,WarehouseCities中的每条记录都会引用仓库中的一条记录:

WarehouseCities(*)...(1)Warehouses 

这意味着如果有一百个没有专用仓库的城市,他们都会引用特定后备仓库的ID。所以我没有看到任何问题(这使我无法理解问题),甚至模型看起来也很明确。

现在,您可以在仓库上识别仓库是否为后备仓库,其属性类似于type_warehouse。

评论后编辑

假设WarehouseCities中没有的城市只有一个后备仓库,我建议将后备仓库保留为另一个仓库并将其Id(WarehouseId)作为应用程序参数(参数表可能是?),当然,这个解决方案是以编程方式,而不是附加到您的数据库平台。

答案 2 :(得分:0)

re:我应该如何表明数据库中的某条记录是“后备”或默认条目

使用另一列isFallback,持有二进制值。我假设您的后备仓库不会有任何与之相关的城市。