2012-06-29 39 views
0

我正在设计一个数据库,它将存储关于一些艺术家的信息。这些艺术家可以属于一个或多个组织。从这些组织中,我只想存储他们的名字,并且我正在考虑与这些组织建立一个表格,这些组织只有名称作为主键而没有别的。是否只有一个表的主键是一个概念性错误?在这种情况下,我会欣赏一些建议来解决这个问题。只有主键字段的表有一个概念错误?

+0

不,一切都很好,只要两个组织不能有相同的名称。 –

回答

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() 
) 

在一个成熟的数据库,你甚至会认识到,企业名称变更,合并,有时分开。您可以通过向记录添加生效日期和结束日期来处理此问题。

+0

好吧,我想我会用这个解决方案。谢谢,这非常有用。 – JavierElBene

0

这样的标准做法是为艺术家设置1个表格,为组织创建1个表格,并将1个关联表格与艺术家与1个或多个组织关联起来。

ARTIST (id, firstName, lastName) 

ORGANIZATION (id, name) 

ARTIST_ORGANIZATION(artist_id, org_id) 

即使组织名称可能/应该是唯一的,这是很好的有一个数字ID作为主键,以便你可以做关联。查询与id的关联比搜索字符串更好。

4

事实上,只有主键的关键字有一个表的概念错误?

不是本身。有完全合法的情况下,所有的领域都包含PK。

在这种特殊情况下,组织名称的关键,但是,这并不一定意味着它应该是键 - 你可以“发明”的另一个关键是小(通常为整数),更容易保持并小学,像这样:

enter image description here

organizarion_id被称为“代理键”,侗族的一些优点,其中包括:

  • 孩子FKs会更苗条(因为只有整数被迁移到孩子,而不是整个字符串)。
  • 您可以更新organization_name而不更新organization_id,因此不会将此更新级联到子级。
  • 一个小整数替代项可能比一个更复杂的自然键更适合于ORM。

缺点:

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

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

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