我在数据库中有两组不同的用户。我想跟踪每个用户是否参加过调查。这两组用户没有任何共同的属性。 (也就是说,一组用户具有任意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吗?
答案 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, ...);
两个表格。