2010-03-01 63 views
3

例如,我有三个表,用不同的数据存储不同类型的用户。但现在我想存储他们的联系信息。存储联系人信息的表格将适合存储所有用户表的数据。对于与同一个表具有1对1关系的多个表,最佳数据库设计是什么?

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

此外,我想存储在用户表中的联系人ID,但这似乎不太理想,因为我们可能没有用户联系信息,直到后来,如果有的话。

我错过了其他选项吗?

+0

有没有什么理由在表中没有相同的用户标识符? – Sagi 2010-03-01 21:19:10

+0

是的,因为用户表之间没有关系,只是在每个用户表和联系人表之间。 – bender 2010-03-01 21:40:33

回答

5

这是我会怎么做:

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 
+0

我差点输入这个相同的答案。但是,需要明确的重要事项是UserSpecialType1.UserId不是现有的ID,而是表Users中新的自动编号的ID。该设计创建了一个新的ID系统,但它修复了原始DB设计中的一个主要缺陷。 (如果正确完成,旧ID仍然可以用于旧代码。) – 2010-03-01 21:29:27

+0

考虑到问题,这看起来是最好的解决方案..谢谢! – bender 2010-03-01 21:43:03

+0

@KM当您必须在UserSpecialType1与仅与UserSpecialType1相关的实体类型之间创建关系时,您会做什么。您使用UserSpecialType1ID或UserID? – 2012-12-14 16:14:40

0

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

+0

这将允许一个主键,但不允许一个外键。 – 2010-03-01 21:32:33

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 
+0

我对'Type differentiator'的想法是一样的,但我确信在某些时候,某些用户会希望是两种类型,这会导致模型出现问题。在我工作的地方,用户总是拿出这样的疯狂东西来破坏事物! – 2010-03-01 21:27:55

+0

总是很有可能发生。在这种情况下,我会将其拆分为用户/类型连接表。我不喜欢每个用户类型模型的唯一表的原因是,作为一名开发人员,如果我只有一个Id,每次需要用户时都会查询n表。 – 2010-03-01 21:35:51

+0

基于查询的上下文,您可能不需要查询每个查询。在Farm屏幕上工作时,查询特殊的FarmUser表,但在Factory屏幕上查询FactoryUser表。处理通用屏幕,您只使用用户表 – 2010-03-01 21:45:31

相关问题