更多联接或更多列?

时间:2013-07-02 19:48:48

标签: sql sql-server tsql

我有一个非常基本的问题,这将是一个更有效的设计,涉及更多联接,或只是将列添加到一个更大的表?

例如,如果我们有一个存储亲戚的表格如下:

Person  |  Father  |  Mother  |  Cousing  | Etc.
________________________________________________

最好直接在该表中列出姓名,年龄等...或者更好地将人名表与他们的姓名,年龄等相关联,并通过person_id或其他内容链接?

这可能是一个简单的例子,因为不仅仅是这两个选项。但为了便于说明,假设关系不能存储在人员表中。

我正在做上面两种选择中的后一种,但我很好奇这是否会达到性能受损的程度,无论是当人员表变得足够大还是有足够的链接列时关系表。

3 个答案:

答案 0 :(得分:2)

Id'寻求更多“正常”以增加灵活性并减少数据重复。

PERSON:
ID
First Name
Last Name

Person_Relations
PersonID
RelationID
TypeID

Relation_Type
TypeID
Description

通过这种方式,你可以支持任何关系(一旦被删除的第四代表亲母亲一方),而无需更改密码。

答案 1 :(得分:1)

将每个人的详细信息与将他们联系在一起的表格分开是一种更灵活的设计。通常,这将导致更少的数据消耗。

你甚至可以更进一步,有三个表:一个用于人,一个用于relationship_types,一个用于关系。

People将拥有所有个人识别信息 - 年龄,姓名等。

Relationship_types会有一个密钥,一个标签,也可能是一个描述。该表用于详细说明每种可能的关系。所以你会有'父'行,'孩子'行,'兄弟'行等等。

然后Relationships表有四个字段:一个用于关系中每个人的密钥,一个用于relationship_type的密钥,一个用于其自己的密钥。请注意,您需要明确指出person列的名称,以明确哪一方是关系的哪一部分(即,如果您指明哪一方,则说A和B具有'父'关系才有意义person 拥有父级的父级vs。

答案 2 :(得分:1)

根据您计划使用数据的方式,可能会有更好的结构

  • Person(id,name等)的表格

  • 关系表(person_a_id,person_b_id,relation_type 等)

其中person_a_id和person_b_id亲自与id相关 样本数据可能看起来像

 ID Name 
  1 Frank
  2 Suzy
  3 Emma

关系

  A B Relationship 
  1 2 Wife
  2 1 Husband
  1 3 Daughter
  2 3 Daughter
  3 1 Father
  3 2 Mother