SQL Server 2008 - 表 - 澄清

时间:2009-10-17 18:26:04

标签: sql sql-server tsql sql-server-2008

我是SQL Server 2008数据库开发的新手。

这里我有一个名为'Student'的主表和一个名为'Address'的子表。这些表之间的公共列是“学生ID”。

我的怀疑是:

  1. 我们是否需要在“地址”表中输入“地址ID”并将其设为主键?这是强制性的吗? (我不会在任何报告中使用此“地址ID”)

  2. 主键列是否必须在任何表中?

  3. 请你帮我解决这些问题。

    请您参考SQL Server 2008数据库设计实践的最佳链接/教程(如果您知道的话),其中包括命名约定,最佳实践,SQL优化等等。

2 个答案:

答案 0 :(得分:4)

1)是的,将ADDRESS_ID列作为ADDRESS表的主键是一个好主意。

但在STUDENT_ID表中将ADDRESS作为外键并不是一个好主意。这意味着地址记录只能与一个学生相关联。学生可以有室友,所以他们的地址相同。这就是为什么将ADDRESS_ID列作为主键是一个好主意,因为它将指示唯一的地址记录。

我没有STUDENT_ID表中的ADDRESS列,而是在STUDENTADDRESS表之间有一个corrollary / xref / lookup表:

STUDENT_ADDRESSES_XREF

  • STUDENT_ID,pk,fk to STUDENTS table
  • ADDRESS_ID,pk,fk to ADDRESS table
  • EFFECTIVE_DATE,date,not null
  • EXPIRY_DATE,date,not null

这使用复合主键,因此只有学生和学生的一个组合。地址存在。我添加了日期,以防有必要确切知道什么时候,因为有人可能会搬回家/等等。

最重要的是,这可以在ADDRESS_ID列之外使用,以允许将单个地址与多个人相关联。

2)是的,坦白地说,定义主键是任何表格的必备条件。

在大多数数据库中,该法案还创建了一个索引 - 使搜索更有效率。这是通常的事情,比如确保记录是一个独特的条目......

答案 1 :(得分:0)

每个表都应该有一种唯一且明确地识别记录的方法。使AddressID成为地址表的主键。

如果没有主键,数据库将允许重复记录;可能会在未来发生连接问题或触发问题(如果实施)。