我一直在努力应该如何表明数据库中的某条记录是“后备”或默认条目。我一直在努力解决如何将问题简化为简单的问题陈述。我将不得不提供一个例子。
假设您正在构建一个非常简单的运送应用程序。您将接受订单,并需要决定从哪个仓库发货。
假设你有几个城市拥有自己的专用仓库*;如果订单来自其中一个城市,您将从该城市的仓库发货。如果订单来自任何其他城市,您希望从某个其他仓库发货。我们称某个其他仓库为后备仓库。
您可以决定这样的架构:
Warehouses
WarehouseId
Name
WarehouseCities
WarehouseId
CityName
解决方案必须强制执行零个或一个后备仓库。
如果没有为相关城市指定仓库,您需要一种方法来指明应该使用哪个仓库。如果它真的很重要,那么你就是在SQL Server 2008上这样做了。
编辑:要清楚,所有有效城市都不在WarehouseCities表中。对于未在WarehouseCities中列出的城市,可能会收到订单。在这种情况下,我们需要能够选择后备仓库。
如果允许任意数量的默认仓库,或者我将默认仓库分配给,例如,状态,我会使用DefaultWarehouse表。我可以在这里使用这样的表,但我需要将它限制为恰好一行,这感觉不对。
您如何表明后备仓库?
*当然,在这个例子中,我们忽略了可能存在多个同名城市的可能性。您正在构建此应用程序的国家/地区严格对所有城市名称强制执行唯一性约束。
答案 0 :(得分:4)
我理解你的问题,但对部分内容有疑问,所以我会更加一般。
关于如何在SQL中实现结构,我将假设所有订单都从单个仓库发货,并且必须将订单挂在订单表上(但这些想法应该适用于其他地方):
执行零/一备份仓库的旧方法是挂起Orders表的Warehouse_Source记录并包含“IsPrimary”字段或“ShippingPriority”,然后包含一个包含OrderID和IsPrimary /的复合唯一索引ShippingPriority。
如果您只有一个备份仓库,则可以将OrderSource_WareHouseID和ShippingSource_Backup_WareHouseID字段添加到订单中。虽然,这不是我想去的路线。
在SQL 2008及更高版本中,我们添加了Filtered Indexes。这些允许您向索引添加WHERE子句 - 从而产生更紧凑的索引。它还具有额外的好处,允许您完成一些只能通过过去的触发器完成的事情。
如果您希望我进一步解释,请添加评论等。
答案 1 :(得分:0)
正如我所看到的,后备仓库毕竟只是另一个仓库,如果我理解,WarehouseCities中的每条记录都会引用仓库中的一条记录:
WarehouseCities(*)...(1)Warehouses
这意味着如果有一百个没有专用仓库的城市,他们都会引用特定后备仓库的ID。所以我没有看到任何问题(这使我无法理解问题),甚至模型看起来也很明确。
现在,您可以在仓库上识别仓库是否为后备仓库,其属性类似于type_warehouse。
评论后编辑
假设WarehouseCities中没有的城市只有一个后备仓库,我建议将后备仓库保留为另一个仓库并将其Id(WarehouseId)作为应用程序参数(参数表可能是?),当然,这个解决方案是以编程方式,而不是附加到您的数据库平台。
答案 2 :(得分:0)
re:我应该如何表明数据库中的某条记录是“后备”或默认条目
使用另一列isFallback,持有二进制值。我假设您的后备仓库不会有任何与之相关的城市。