在两个表上从相同序列中绘制自动生成的值

时间:2009-09-28 16:18:54

标签: database-design

我在数据库中有两组不同的用户。我想跟踪每个用户是否参加过调查。这两组用户没有任何共同的属性。 (也就是说,一组用户具有任意ID号,名称,有时还有电子邮件地址。另一组具有任意ID号和电子邮件地址。唯一的共同元素,电子邮件地址,不保证是唯一的或甚至出现在第一组中 - 两个用户可能以某种方式在第一组中共享相同的电子邮件。)

让我们说这些集合看起来像这样:

   SetOne: SetOneId, Name, Email nullable
   SetTwo: SetTwoId, Email unique

不知何故,我需要创建一个“统一”密钥来跟踪SetOne用户和SetTwo用户。有人建议我只有一个看起来像

的映射表
   UnifiedMap: UnifiedKey integer primary key, SetOneId integer nullable, SetTwoId integer nullable

并且只需要只有SetOneId或SetTwoId是非空的。我不喜欢上面的解决方案,因为我不想在每条记录中看到NULL。

有什么方法可以有两张桌子吗?

   UnifiedSetOneMap: UnifiedKey integer primary key, SetOneId integer
   UnifiedSetTwoMap: UnifiedKey integer primary key, SetTwoId integer

其中两个表没有共同的UnifiedKey字段值。 (即,UnifiedSetOneMap.UnifiedKey INTERSECT UnifiedSetTwoMap.UnifiedKey是空集。)

我希望自动生成UnifiedKey。不知何故,我想指定两个表都应该从相同的序列中绘制自动生成的UnifiedKey字段。

为了探索序列的概念,假设我不能使用GUID。

理想情况下,此解决方案将是可移植的。但是,在可能无法制作可移植解决方案的情况下,TSQL就是我将要实现的。

我采取的最佳方法是什么?我应该简单地使用第一个UnifiedMap的想法并使用NULL吗?

3 个答案:

答案 0 :(得分:2)

对于SQL Server DB,我将主键创建为:

SetOneId integer identity(1,2) primary key;
SetTwoId integer identity(2,2) primary key 

身份(种子,增量):种子是起点,增量是步骤

并非所有数据库都有身份选项,因此我不知道它是否适合您。

答案 1 :(得分:0)

统一地图表方法当然更有意义。

如果您希望了解两个单独的UnifiedSet表的想法,则需要在UnifiedSetOneMap上发生插入时更改UnifiedSetTwoMap的种子值,反之亦然,在每个上使用触发器。

就像我说的那样,UnifiedMap方法更简单,更优雅。

答案 2 :(得分:0)

基于序列的解决方案不能简单地移植,因为并非所有数据库都支持序列。

也就是说,使用“两个独立的表”方法是相当简单的,两种方法都使用相同的序列作为其PK值。你在使用某种ORM吗?例如,JPA(或.NET世界中的NHibernate)允许您开箱即用。如果您手动执行此操作,则基本上需要执行以下操作:

INSERT INTO SetOne (UnifiedKey, ...) VALUES (unified_seq.NEXTVAL, ...);

两个表格。