如何处理不同类型用户表的主键?
Posted
技术标签:
【中文标题】如何处理不同类型用户表的主键?【英文标题】:How to handle the primary key of different types of user tables? 【发布时间】:2017-08-04 03:30:28 【问题描述】:我目前正在做一个项目,我们有两种类型的用户。
我有一个通用的用户表,用于记录他们的 User_ID、user_name 等所有对两个用户都相似的数据。
我在网上查了一下,发现做两个单独的表是很常见的,只是在这些表中有所不同。
因为现在我有两个表(A 和 B),所以我的主键不能与我的 User_ID 相同,因为我有 2 个数据库。如果用户 1 创建了账户 A,则匹配,但如果用户 2 创建了账户 B,则 User_ID 为 2,而表中的主键为 1。
是否最好手动将主键设置为与 user_ID 相同?或者最好的方法是什么?
【问题讨论】:
你有一个“普通用户”表。 . .还有什么?A
是什么? B
是什么?什么是“账户A”? “账户 B”?示例数据确实有助于传达您正在尝试做的事情。
表B应该有一个表A的外键,应该是主用户表。
为什么不为所有用户提供一个表,并通过为此目的添加的字段的值来区分它们,例如,用户类型的枚举。
抱歉,我应该添加更多细节!所以项目有两种类型的用户,用户A只需要写下他们的电话号码和地址,而用户B只需要输入他们的电子邮件地址。因此,我决定将这些表拆分为 UserA(包含主键、电话号码和地址)和 UserB(包含主键、电子邮件地址),而不是 1 个具有 Null 值的表。我很好奇用户A和用户B的主键使用什么。如果我从 1 开始并自动递增,我不能使用 User_ID 作为 UserA 和 UserB 的外键,因为可能存在重叠。
我认为您应该只拥有一个包含可空列的表,或者完全规范化并拥有 三个 表:一个 UserID 表和一个电话号码+地址表和一个电子邮件表,两者都带有 UserID 外键,这显然是矫枉过正。您当然不应该有两个同等地位的用户表,可以在其中插入新的 UserID。这不是标准化的。
【参考方案1】:
我在网上查了一下,发现做2个单独的表是很常见的,只是在这些表中有所不同。
我会感到惊讶。这不是规范化的架构。
我认为您应该只拥有一个包含可空列的表,或者按照this answer here,或者(疯狂地)全力以赴:完全规范化并拥有 三个 表:一个 UserID表,还有一个电话号码+地址表和一个电子邮件表,两者都带有 UserID 外键,这显然是主要的矫枉过正。如果您使用辅助表,您只需对 UserID 表中的 UserID 进行联接。
您当然不应该有两个同等地位的用户表,可以在其中插入新的 UserID。这不是标准化的。
【讨论】:
以上是关于如何处理不同类型用户表的主键?的主要内容,如果未能解决你的问题,请参考以下文章
JPA中,在调用persist()时,数据库自动增长的主键如何处理
CREATE UNIQUE INDEX 终止,因为发现了索引 ID 1 的重复键。最重要的主键为 'type 6c, len 9'。如何处理?