gpt4 book ai didi

sql-server - 请咨询: SQL Server Identity vs Unique Identifier keys when using Entity Framework

转载 作者:行者123 更新时间:2023-12-03 16:33:55 25 4
gpt4 key购买 nike

我正在设计一个相当复杂的系统。我们的主要关注点之一是支持 SQL Server 对等复制。这个想法是支持几个地理上分离的节点。

第二个问题是在中间层使用现代 ORM。我们的首选一直是 Entity Framework ,主要是因为开发人员喜欢使用它。 (他们喜欢 LiNQ 支持。)

所以问题来了:

考虑到点对点复制,我决定对每个表的主键使用具有默认值 newsequentialid() 的 uniqueidentifier。这似乎在避免键冲突和减少索引碎片之间提供了良好的平衡。

但是,事实证明,当前版本的 Entity Framework 有一个 very strange limitation :如果实体的键列是唯一标识符 (GUID),则不能将其配置为使用数据库提供的默认值 (newsequentialid())。应用层必须生成 GUID 并填充键值。

所以这里是辩论:

  • 放弃 Entity Framework 并使用另一个 ORM:
  • 使用 NHibernate 并放弃对 LiNQ 的支持
  • 使用 linq2sql 并放弃 future 的支持(更不用说绑定(bind)到 DB 上的 SQL Server)
  • 放弃 GUID 并采用另一种 PK 策略
  • 设计一种在应用层生成顺序 GUID(COMB?)的方法

  • 我倾向于使用 linq2sql(我的开发人员真的很喜欢 linq2[stuff])和 3 的选项 1。这主要是因为我有点不知道支持我们目标的复制方案的替代关键策略,同时也让事情保持清醒开发人员的观点。

    任何见解或意见将不胜感激。

    最佳答案

    我同意克雷格的建议 - 选项 4。

    您始终可以使用由中间层填充的 GUID 列作为您的 PRIMARY KEY(这是一个 LOGICAL 构造)。

    为了避免大量索引(因此:表)碎片,请使用其他一些键(最好是 INT IDENTITY 列)作为 CLUSTERING KEY - 这是一个物理数据库结构,可以与主键分开。

    默认情况下,主键是集群键——但不一定是这样。事实上,通过在我“继承”的数据库上执行此操作,我提高了性能并大大降低了碎片 - 添加一个 INT IDENTITY 列并将集群键放在那个小、不断增长、永不改变的 INT 上 - 就像一个魅力!

    马克

    关于sql-server - 请咨询: SQL Server Identity vs Unique Identifier keys when using Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/604273/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com