SQL Server表对面表中的主键和外键?

时间:2015-05-04 14:47:24

标签: sql-server database-design

情况:

我有两张桌子:

表1

TrackID PK
random columns
ActionID FK

表2

ActionID PK
random columns
TrackID FK

问题: 上面的设置是否存在问题(规范化?)或需要更多信息......?

由于

2 个答案:

答案 0 :(得分:0)

提供的模式模拟两个由两个不同关系连接的实体。

第一个关系R1 Track - * ---- 1 - Action由表1中的字段ActionID建模

第二个关系R2 Track - 1 ---- * - Action由表2中的字段TrackID建模。

如果您的要求表明您有两种不同的关系,那么这可能是一个有效的架构。

此案例的简化示例包括两个实体EmployeeProject

关系

manages Employee - 1 ---- * - Project

和关系

works Employee - * ---- 1 - Project

假设一名员工最多只能为一个项目工作。

这里的问题是你想建模一两个关系吗?

如果您想在实体之间建立一个关系模型,那么您的架构有些错误,否则它是正确的。

答案 1 :(得分:0)

  

上面的设置有问题吗?

不,没有"问题"在这个词的经典含义。你可以坚持你的设计,它没有问题。但是,它是标准的吗?这将是我将在下一节讨论的内容。

  

什么(规范化?)或需要更多信息......?

是的,正如我上面暗示的那样,我可以为您提供信息,以便标准化或正常化"你的设计。不幸的是,您对此数据库设计的目的并不十分清楚。知道这个目的对于充分回答问题至关重要。但是,我将解决两个可能的目的,我想你已经有了其中一个。

目的1:每个曲目最多只能有一个动作:在这种情况下,您不需要两个表格。你可以:

TrackID PK
random columns
random columns of actions /*(will stay null if no action takes place)*/

目的2:每个曲目可以有零个或多个动作:在这种情况下,您需要两个表格如下:

表1:

TrackID PK
random columns

表2:

ActionID PK
random columns
CreateDate /*(search for creating a DateTime column with default to current date)*/
TrackID FK

因此,如果您想要最新或当前的操作,请选择前1,其中CreateDate desc的订单与“跟踪”相关。