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