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



我一直在努力解决如何指示数据库中的某个记录是"回退"或默认条目的问题。我也一直在努力解决如何将我的问题简化为一个简单的问题陈述。我要举一个例子。

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

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

你可能会决定这样一个模式:

Warehouses
    WarehouseId
    Name
WarehouseCities
    WarehouseId
    CityName

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

如果没有为该城市指定任何仓库,您需要一种方法来指示应该使用哪个仓库。如果它真的很重要,那么您将在SQLServer2008上执行此操作。

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

如果允许任何数量的默认仓库,或者如果我将默认仓库分配给州,我将使用DefaultWarehouse表。我可以在这里使用这样的表格,但我需要将其限制在一行,这感觉不太好。

您将如何指示后备仓库?


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

我理解你的问题,但对其中的一些部分有疑问,所以我会更笼统一点。

  • 如果可能的话,我会将仓库/备份仓库数据与您的库存数据一起存储(要么直接挂起仓库,要么是库存表中的特定产品)
  • 如果必须通过业务逻辑计算设置,那么记录应该挂在order/order_item表上

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

  • 实施零/一备份仓库的旧方法是挂起Orders表的Warehouse_Source记录,并包含"IsPrimary"字段或"ShippingPriority",然后包含包含OrderID和IsPrimary/Shipping优先级的复合唯一索引。

  • 如果您只有一个备份仓库,则可以将ShippingSource_WareHouseID和ShippingSource _backup_warehouse ID字段添加到订单中。不过,这不是我要走的路。

在SQL 2008及更高版本中,我们添加了筛选索引。这允许您将WHERE子句添加到索引中,从而生成更紧凑的索引。它还有一个额外的好处,可以让你完成一些过去只能通过触发器完成的事情。

  • 您可以在OrderID&IsPrimary/ShippingPriority(其中IsPrimary=0)

如果你想让我进一步解释,请添加评论或类似内容。

re:我应该如何指示数据库中的某个记录是"回退"或默认条目

使用另一列isFallback,其中包含一个二进制值。我假设你的后备仓库不会有任何城市与之相关。

在我看来,后备仓库毕竟只是另一个仓库,如果我理解的话,仓库城市中的每一条记录都引用了仓库中的一条记录:

WarehouseCities(*)...(1)Warehouses 

这意味着,如果有一百个城市没有专用仓库,它们都会引用特定后备仓库的id。所以我没有看到任何问题(这让我觉得我不理解这个问题),即使模型看起来定义得很好。

现在,您可以通过warehouse上的type_warehouse属性来识别仓库是否为后备仓库。

评论后编辑

假设WarehouseCitys中没有的城市只有一个后备仓库,我建议将后备仓库保留为另一个仓库,并将其Id(WarehouseId)保留为应用程序参数(可能是参数表?),当然,此解决方案是通过编程实现的,不连接到您的数据库平台。

最新更新