【问题标题】:What is the best database design for multiple tables with 1 to 1 relationship to the same table?对于与同一个表具有 1 对 1 关系的多个表,最好的数据库设计是什么?
【发布时间】:2011-01-22 11:32:25
【问题描述】:

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

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

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

我还缺少任何其他选项吗?

【问题讨论】:

  • 表中没有相同的用户 ID 有什么原因?
  • 是的,因为用户表之间没有关系,只有每个用户表和联系人表之间。

标签: database-design


【解决方案1】:

在我的脑海中,我会将所有用户放在同一个表中,并带有类型区分符。

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

【讨论】:

  • 我对@9​​87654322@ 也有同样的想法,但我敢肯定,在某些时候,某些用户会想要成为两种类型,这会导致模型出现问题。在我工作的地方,用户总是想出这样疯狂的东西来破坏东西!
  • 总是很有可能发生。在那种情况下,我会拆分为用户/类型连接表。我不喜欢每个用户类型模型的唯一表的原因是,作为开发人员,如果我只有一个 ID,我每次想要一个用户时都会查询 n 表。
  • 根据查询的上下文,您可能不需要逐个查询。在 Farm 屏幕上工作时,您查询特殊的 FarmUser 表,但在 Factory 屏幕上您查询 FactoryUser 表。处理只使用 User 表的通用屏幕
  • 这也是一个有趣的观点......我想这归结为你认为你需要多少灵活性,这并不总是很容易知道。
【解决方案2】:

您可以在联系人表中使用复合键,例如用户类型ID、用户ID

【讨论】:

  • 这将允许主键,但不允许外键。
【解决方案3】:

这就是我要做的:

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

【讨论】:

  • 我几乎输入了同样的答案。不过,需要明确的重要一点是,UserSpecialType1.UserId 不是现有 ID,而是表 Users 中新的自动编号 id。此设计创建了一个新的 ID 系统,但它修复了原始 DB 设计中的一个主要缺陷。 (如果处理得当,旧的 ID 仍然可以在遗留代码中使用。)
  • 考虑到这个问题,这看起来是最好的解决方案。谢谢!
  • @KM 当您必须在 UserSpecialType1 和一种仅与 UserSpecialType1 相关的实体之间创建关系时,您会怎么做。您使用的是 UserSpecialType1ID 还是 UserID?
  • @Bugeo,您也可以这样做,但我可能会在 UserID+UserSpecialType1ID 上进行复合 PK(按此顺序),这样您就可以使用 UserID 轻松加入,但这会强制该用户成为在 UserSpecialType1 中。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2010-09-30
  • 2011-05-03
相关资源
最近更新 更多