只有主键字段的表是一个概念错误?

时间:2012-06-29 18:06:05

标签: database database-design

我正在设计一个存储一些艺术家信息的数据库。这些艺术家可以属于一个或多个组织。从这些组织我只想存储他们的名字,我正在考虑创建一个表格,这些组织只有名称作为主键,没有别的。是否有一个表只有主键的fieds一个概念错误?在这种情况下,我将很感激一些解决这个问题的建议。

3 个答案:

答案 0 :(得分:5)

  

是否有一个表只包含主键的表格是一个概念错误?

不是单独的。在完全合法的情况下,所有字段都包含PK。

在这种特殊情况下,组织名称​​是键,但这并不一定意味着它应该是键 - 您可以“发明”另一个键较小(通常为整数)且更易于维护并使 it 为主要内容,如下所示:

enter image description here

organizarion_id被称为“代理键”,而这样做的一些优点包括:

  • Child FKs会更瘦(因为只有整数被迁移到子节点,而不是整个字符串)。
  • 您可以在不更新organization_name的情况下更新organization_id,从而无需将此更新级联到儿童。
  • ORM的小整数代理可能比更复杂的自然密钥更友好。

缺点:

  • 可能需要更多加入。
  • 需要多一个索引,每个附加索引都会带来开销(即使在基于堆的表中,尤其是在clustered tables中)。

正如您所看到的,这是一个平衡问题,您是唯一一个拥有足够领域知识来做出正确决策的人。

注意:organization_artist中的字段顺序很重要。如果您需要有效地查询给定组织的艺术家,请使用上面显示的顺序,如果您需要给定艺术家的组织,请将其反转。如果你需要两个方向,你需要在这两个字段上的另一个复合索引(在PK下面的索引旁边),但顺序相反。如果只能使用一个索引,请考虑对此表进行集群(如果您的DBMS支持它)。

答案 1 :(得分:1)

您需要OrganizationId来处理组织名称更改的情况。

您可能还遇到不同组织似乎具有相同名称的情况。有多少“现代艺术博物馆”? (好吧,对纽约人来说,只有一个; - )

您的组织表可能会随着时间的推移而扩展,包括短名称,地址,联系人,首选语言等列。因此,该表应如下所示:

 create table Organizations (
    OrganizationId int not null identity(1,1),
    Name varchar(255),
    CreatedBy varchar(255) default system_user,
    CreatedAt datetime default getdate()
)

在成熟的数据库中,您甚至会认识到组织会更改名称,合并,有时会拆分。您可以通过向记录添加有效日期和结束日期来处理此问题。

答案 2 :(得分:0)

这样的标准做法是为艺术家提供1个表,为组织提供1个表,以及将艺术家与1个或多个组织关联的1个关联表。

ARTIST (id, firstName, lastName)

ORGANIZATION (id, name)

ARTIST_ORGANIZATION(artist_id, org_id)

即使组织名称可能/应该是唯一的,但最好将数字ID作为主键,这样您就可以进行关联。查询与id的关联比搜索字符串更好。