我正在设计一个相当复杂的系统。我们的主要关注点之一是支持 SQL Server 对等复制。这个想法是支持几个地理上分离的节点。
第二个问题是在中间层使用现代 ORM。我们的首选一直是实体框架,主要是因为开发人员喜欢使用它。(他们喜欢 LiNQ 支持。)
所以问题来了:
考虑到点对点复制,我决定对每个表的主键使用具有默认值 newsequentialid() 的 uniqueidentifier。这似乎在避免键冲突和减少索引碎片之间提供了良好的平衡。
然而,事实证明,当前版本的 Entity Framework 有一个非常奇怪的限制:如果实体的键列是唯一标识符 (GUID),则无法将其配置为使用数据库提供的默认值 (newsequentialid())。应用层必须生成 GUID 并填充键值。
所以这里是辩论:
- 放弃实体框架并使用另一个 ORM:
- 使用 NHibernate 并放弃对 LiNQ 的支持
- 使用 linq2sql 并放弃未来的支持(更不用说绑定到数据库上的 SQL Server)
- 放弃 GUID 并采用另一种 PK 策略
- 设计一种在应用层生成顺序 GUID(COMB?)的方法
我倾向于使用 linq2sql(我的开发人员真的很喜欢 linq2[stuff])和 3 的选项 1。这主要是因为我有点不知道支持我们目标的复制方案的替代关键策略,同时也让事情保持清醒开发人员的观点。
任何见解或意见将不胜感激。