你会选择以下两个选项中的哪一个?为什么?
备选方案1:
Customer -> CustomerID_PK, DateOfBirth, Address, Username, Password
备选方案2:
Customer -> CustomerID_PK, DateOfBirth, Address
CustomerInfos -> CustomerID_PK, Username, Password
您不知道经理存储每个客户以前的所有用户名和密码是否重要。您只知道每个客户可以随时更改他的密码和他的昵称。不管安全方面,您会遵循哪种方法?
设计良好的数据库是物理世界相当好的模型。所以,在决定像你这样的问题时,想想世界上发生了什么。
您在这里的实体是客户。客户应该具备哪些属性?哪些属性本质上属于每个客户?客户是自然人,因此每个人都有唯一的出生日期。在您的系统中,每个客户只有一个用户名和密码。所以这些是显而易见的属性。
您还可以决定您的客户可以只有一个地址。或者,也许一个客户可以根据您的业务规则拥有多个地址(家、办公室?)如果您选择“恰好一个地址”业务规则,则地址也是您的客户实体的属性。如果不是,则有一个名为Address的单独实体,如下所示。(类型为'home'、'office'等)。
(address_id PK, customer_id FK, type, address)
如果需要为客户存储以前的用户名/密码组合,则需要一个单独的凭据实体。每个客户将拥有一个或多个凭据。因此凭据表如下所示。
(credential_id PK, customer_id FK, username, password, effective_date)
无论如何,为了数据工程的清晰性,您应该使用一个表来存储一个实体。因此,我建议方案1。
这是一个切实可行的建议。模式只会随着时间的推移增加更多的表,因此避免额外的表是很好的。包含具有相同代理(自动递增)主键的多个表的模式更难理解和维护,而且那些额外的表是不必要的。
例外情况:您已经有数百万客户,您需要添加更多的属性,但是您负担不起重新组织表和添加列的停机时间。