2009-08-24 46 views
0

我有几个数据库表,它们只需要引用另一个表的唯一标识,例如我是否需要为每个表定义一个新的主键字段?

Customer  Holiday 
********  ******* 
ID (PK) ---> CustomerID (PK) 
Forename  From 
Surname  To 
.... 

这些表格,如假日,只存在用于存放有关客户的信息。因此,我是否需要指定一个单独的字段来保存假期的ID?即

Holiday 
******* 
ID (PK) 
CustomerID (FK) 
... 

不然我就ok了,在这种情况下,只设置在客户作为表的主键?

Regards, James。

回答

3

这真的取决于你在做什么。

如果每个客户只能有1个假期,那么是的,您可以使customerid为主键。

如果每个客户可以有多个节假日,那么不,你会想添加一个新的ID列,使它成为主要的。这使您可以选择每个客户的假期,并通过其唯一ID选择单个记录。

此外,如果每个客户只能有1个假期,我只是将节假日信息添加到表中,因为一对一关系通常是不必要的。

+0

好的,在这个特殊的例子中,客户可以有多个节假日。但是,当客户在该表中只能有1条记录时,第一个例子会是最合适的? – James 2009-08-24 21:08:38

+1

詹姆斯 - 可能。如果每个客户只有1条记录,我几乎建议将其添加到客户表。除非有一对一的关系的强制性理由。 – 2009-08-26 13:58:43

+0

+1好点!我有一张桌子,每个顾客只能有一个记录,而我将它分成一张桌子的原因是因为有很多关于这个特定桌子的信息,我只是不觉得它们属于客户桌子。 – James 2009-09-02 19:06:50

0

如果我正确理解您的问题,那么您只能在假期中使用客户表作为主键,如果从未是表中该客户的任何其他假期。换句话说,一个客户的两个假期会将客户ID用作主键。

0

如果会有与此数据库相关的面向对象的程序,每个实体(每行)都必须有一个唯一的键。

您的第二个设计确保每个Holiday节点都可以由OO应用程序使用简单的对象关系映射进行唯一标识和处理。

通常,最好确保数据库中的每个实体都有一个唯一的,不可变的系统分配(“代理”)键。其他“自然”键可以具有唯一的索引,约束等,以适应业务逻辑。

0

以前的答案是正确的,但也请记住,每个表中可以有2个独立的主键,而“假期”表将具有CustomerId的外键。

然后,您可以在代码中管理为客户分配的假期,以确保只有一个假期可以分配给客户,但这会带来问题并发性,即2人为客户添加假期同一时间最有可能导致有2个假期的客户。

你甚至可以放置在客户表节日领域,如果一个客户只能与一个节日来创建的,而这样的设计是凌乱,而在你的问题2不是真的劝

所以再次,选择仍然是最好的方式去,只是给你你的选择。

+0

我不是依赖代码来强制执行隐式数据库约束的忠实粉丝。编码缺陷,SQL脚本和其他力量很容易破坏这些假定的约束/关系。 – Mayo 2009-08-24 19:29:07

+0

我也不是一个粉丝,但对于这样一个简单的问题,它的价值尽可能多的变化 – Neil 2009-08-25 11:37:01

0

在实践中,我发现每个表都应该有一个唯一的主键来标识这些表中的记录。所有与其他表格的关系都应该明确声明。

这有助于他人更好地理解关系,特别是如果他们使用工具将模式逆向工程化为可视表示。

此外,它为您提供更大的灵活性来扩展您的解决方案。您现在可能每个客户只有一个假期,但如果您将客户ID作为主键,则这一点更难改变。

如果要在假期表中指定客户的唯一性,请在该外键上创建唯一索引。事实上,当查询客户ID时,这可以提高性能(尽管我猜测你不会看到足够的记录来注意到这种改进)。

相关问题