Database design 对于与同一个表有1:1关系的多个表,最好的数据库设计是什么?

Database design 对于与同一个表有1:1关系的多个表,最好的数据库设计是什么?,database-design,Database Design,例如,我有三个表,它们存储具有不同数据的不同类型的用户。但现在我想储存他们的联系信息。存储联系人信息的表适用于存储所有用户表的数据 问题是,我在不同的用户表之间有不同的或可能重复的ID,因此无法创建与联系人表的关系。一种解决方案是为每种用户类型创建一个联系人表,但这似乎是浪费,因为唯一的区别是ID 此外,我还考虑将联系人ID存储在用户表中,但这似乎不太理想,因为我们可能要等到以后才能获得用户的联系信息(如果有的话) 我还缺少其他选项吗?这就是我要做的: table Users UserID

例如,我有三个表,它们存储具有不同数据的不同类型的用户。但现在我想储存他们的联系信息。存储联系人信息的表适用于存储所有用户表的数据

问题是,我在不同的用户表之间有不同的或可能重复的ID,因此无法创建与联系人表的关系。一种解决方案是为每种用户类型创建一个联系人表,但这似乎是浪费,因为唯一的区别是ID

此外,我还考虑将联系人ID存储在用户表中,但这似乎不太理想,因为我们可能要等到以后才能获得用户的联系信息(如果有的话)

我还缺少其他选项吗?

这就是我要做的:

table Users
UserID                 -PK auto number
UserLogin
UserName

table UserSpecialType1
UserSpecialType1ID     -PK auto number
UserID                 -FK
SpecialInfoA
SpecialInfoB

table UserSpecialType2
UserSpecialType2ID     -PK auto number
UserID                 -FK
SpecialInfoC
SpecialInfoD

table UserContactInfo
UserContactInfoID      -PK auto number
UserID                 -FK
EmailAddress
PhoneNumber
Address

您可以在联系人表中使用复合键,例如UserTypeID,UserId

在我的头顶上,我会使用类型区分符将所有用户放在同一个表中

TABLE User
Id
Value1
Value2
UserTypeCode

TABLE UserType
TypeCode

TABLE Contact
UserId
ContactInfo

TABLE UserTypeAttribute
UserType
AttributeTypeCode

TABLE AttributeType
AttributeTypeCode

TABLE UserAttributeTypeValue
UserId
AttributeTypeCode
Value

是否有任何原因导致表中的用户ID不相等?是的,因为用户表之间没有关系,只是每个用户表和联系人表之间没有关系。我对
类型区分符的想法也是一样的,但我确信在某一点上,有些用户希望有两种类型,这会导致模型出现问题。在我工作的地方,用户总是想出像这样疯狂的东西来破坏东西!总是很可能发生。在这种情况下,我将拆分为用户/类型联接表。我不喜欢“每用户类型唯一表”模型的原因是,作为一名开发人员,如果我只有一个Id,每次需要一个用户时,我都会查询n个表。根据查询的上下文,您可能不需要查询每个表。在Farm屏幕上工作时,可以查询特殊的FarmUser表,但在Factory屏幕上可以查询FactoryUser表。处理您只使用用户表的通用屏幕这也是一个有趣的尝试。。。我想这取决于你认为你需要多大的灵活性,这并不总是容易知道的。我几乎键入了同样的答案。但是,需要明确的一点是,UserSpecialType1.UserId不是现有的ID,而是表Users中新的自动编号ID。此设计创建了一个新的ID系统,但它修复了原始DB设计中的一个主要缺陷。(如果操作得当,旧的ID仍然可以在遗留代码中使用。)考虑到这个问题,这似乎是最好的解决方案。。谢谢@KM当您必须在UserSpecialType1和一种仅与UserSpecialType1相关的实体之间创建关系时,您会怎么做。您可以使用UserSpecialType1ID或UserID?@Bugeo,您也可以这样做,但我可能会对UserID+UserSpecialType1ID(按此顺序)进行组合PK,以便您可以轻松地使用UserID加入,但这会强制该用户位于UserSpecialType1内。这将允许主键,但不允许外键。