Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 状态表数据库设计_Sql Server_Database - Fatal编程技术网

Sql server 状态表数据库设计

Sql server 状态表数据库设计,sql-server,database,Sql Server,Database,我有以下四个表格: 装运 ShipmentID主键 OtherShipmentInfo 装运状态 状态ID主键 状态描述 装运阶段 ShipmentStageID PK ShipmentID FK到装运 StatusID FK到ShipmentStatus 日期时间 交货代码 DeliveryCodeID主键 交货代码说明 我的问题是,哪个表更适合存储与装运最终状态相关的信息?如果我只需要在最终装运阶段时记录交货代码,我应该在ShipmentStages表中使用外键,还是将外键放置在装运表中,并

我有以下四个表格:

装运

ShipmentID主键 OtherShipmentInfo 装运状态

状态ID主键 状态描述 装运阶段

ShipmentStageID PK ShipmentID FK到装运 StatusID FK到ShipmentStatus 日期时间 交货代码

DeliveryCodeID主键 交货代码说明 我的问题是,哪个表更适合存储与装运最终状态相关的信息?如果我只需要在最终装运阶段时记录交货代码,我应该在ShipmentStages表中使用外键,还是将外键放置在装运表中,并仅在最终阶段时更新该外键

因为DeliveryCode只与最终装运状态相关,所以如果我将外键放在ShipmentStages表中,大多数条目将具有空值

我觉得这两种方案都可行,但哪一种更合适?

三种选择:

将您的状态和交货代码合并到一个表中。如果装运具有DeliveryCode状态,则表示它已交付。本质上,已交付状态将替换为所有可能的交付代码。ShipmentStages仍然只需要一个对ShipmentStatus的FK引用。DeliveryCode表已删除

在ShipmentStages中使用FK引用将N/a或待定状态添加到交货代码表中。任何尚未交付的装运状态将使用尚未交付的交付代码

重新设计模型,将交付事件作为单独的实体捕获。这需要一个引用DeliveryCode和Shipmment表的表。这是最具扩展性的,并且在将来最不可能需要重新设计

--更新以征求意见--

分开装运阶段和交付并不违反规范。交货和装运阶段都描述装运,但交货不描述装运阶段。3NF可能会要求在描述装运时将交货属性放入装运表中。您可能为交付捕获的属性并不描述装运阶段,而是描述一种装运阶段。由于该阶段有其独特的属性,因此可以将其分解为单独的实体

如果数量/性能要求,将交付事件属性分离到它们自己的表中可以减少特定于交付工作的装运表上的CRUD负载。另一种考虑的方式是,如果您主要使用装运表而没有交付细节和/或交货细节而没有装运细节,则可以通过分离它们来获得收益。您可以通过让交货表使用发货表PK作为其自己的PK 1-[0,1]关系来将它们紧密耦合


如果您还没有性能问题,请从发货表中的交货代码开始。尽管需要进行开发工作,但它始终可以稍后分离。过早优化有时会浪费时间/金钱。

请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加您实际使用的数据库的标签,以避免混淆。我已经编辑了这篇文章,只包含了适当的标签。是否会因为一批货物被退回和重新装运而导致多次交货?所有货物是附在同一批货物上,还是各自是一个单独的项目?在我们的模型中,一批货物只能有一次尝试交货。如果无法交付,则将创建新的装运。如果使用选项3,并且我们使用单独的实体来处理实际交付事件,那么ShipmentStages表会发生什么情况?一个触发器,在输入新的交货表时更新ShipmentStages表?这是否违反了规范化方法?我建议通过前端应用程序或后端存储过程强制实现这种关系。我不喜欢通过触发器来加强关系。我发现当出现问题时,很难对它们进行故障排除/回放。我也在我的答案中添加了额外的内容。感谢您的周到回复。这迫使我重新思考我的模式,做出更好的改变。我将继续创建一个独立的交付实体,因为我相信从长远来看,这将更加灵活。非常感谢。