我正在设计一个存储一些艺术家信息的数据库。这些艺术家可以属于一个或多个组织。从这些组织我只想存储他们的名字,我正在考虑创建一个表格,这些组织只有名称作为主键,没有别的。是否有一个表只有主键的fieds一个概念错误?在这种情况下,我将很感激一些解决这个问题的建议。
答案 0 :(得分:5)
是否有一个表只包含主键的表格是一个概念错误?
不是单独的。在完全合法的情况下,所有字段都包含PK。
在这种特殊情况下,组织名称是键,但这并不一定意味着它应该是主键 - 您可以“发明”另一个键较小(通常为整数)且更易于维护并使 it 为主要内容,如下所示:
organizarion_id
被称为“代理键”,而这样做的一些优点包括:
organization_name
的情况下更新organization_id
,从而无需将此更新级联到儿童。缺点:
正如您所看到的,这是一个平衡问题,您是唯一一个拥有足够领域知识来做出正确决策的人。
注意: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的关联比搜索字符串更好。