在许多关系数据库设计中,其他表中都有引用的字段。
例如,考虑具有唯一用户名的用户表和存储地址数据的第二个表。
我会说的一种可能的布局是常用方法,因为我在大多数软件中都观察到了这种布局,就是使用像这样的自动增量ID:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
这就是我过去经常这样做的方式,也是我在大多数情况下所看到的方式。
另一种方法是:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
在这里,我们还将完整的用户名存储在adressdata表中。
对我来说,它具有以下优点:
您可以直接从表中选择用户名,而无需将其连接到另一个表。在此示例中,从应用程序的角度来看,这可能不太重要,但这仅是示例。
在主/主复制环境中扩展数据库可能会更容易,因为不存在auto_increment冲突。
但也有缺点:
- 第二张表中字段的索引和数据(但更相关的可能是索引)的空间要求更高。
- 用户名的更改将需要传播到所有表,这比仅在一个表中进行更改并保留ID更为耗资源。
在我看来,使用文本字段并且不使用增量ID更加容易,并且这种折衷是最小的,并且在大多数应用程序中是不相关的。
当然,某些对象按其性质用递增编号标识(例如,论坛帖子应收到递增编号,因为可能没有其他唯一字段,例如标题等)。
但是在开始以完全不同的方式设计数据库布局之前,我想知道是否有我没有想到的东西。
有没有最佳做法?
是否存在我没有想到的利弊,并且以后可能会产生影响?
您如何亲自设计有关以上几点的数据库?为什么?