我有WinForm应用程序(C#)和Backed as SQL Server 2008,它在客户端位置脱机工作。目前,所有分支都是从单个位置进行管理,因此标识列值在分支中始终是唯一的。
现在,我希望从多个位置管理此应用程序,并且应该可以脱机以及在线工作。为了实现这一点,我们将SQL Server放在PUBLIC IP中,每个分支都将运行一个单独的本地SQL Server实例。数据将定期在本地和中央服务器之间同步。
这种方法对同步数据有好处,还是我能做的更好?
如果我采用上述方法,我将面临的问题是同步数据。表格结构存在问题,例如。我有一个表COURSES如下:
COURSES ( COURSE_ID (identity column), COURSE_NAME, COURSE_BRANCH_ID)
其中
COURSE_ID
是IDENTITY列COURSE_NAME
代表标准COURSE_BRANCH_ID
代表课程所在的分支。现在每个SQL Server都会为COURSE_ID
列生成自己的值,对于不同的服务器可能会相同。
COURSE_ID
和COURSE_BRANCH_ID
。COURSE_BRANCH_ID
附加COURSE_ID
?我想到的方法
COURSE_ID
列中删除身份COURSE_ID
的值更新为Concate(COURSE_BRANCH_ID,ID)
convert(number(convert(varchar,COURSE_BRANCH_ID) + convert(varchar,ID))
但这需要付出很多努力,因为我有大约19张表存在这样的问题。我有什么比这更好的事情吗?欢迎任何建议!谢谢!
答案 0 :(得分:2)
有几种与此问题相关的方法。您提到的将分支ID连接到标识字段的那个。
你可以使用GUID,碰撞的可能性几乎为零。 或者您可以设置Identity Seed和Increment,以便每个分支具有不同的起始值,并且所有分支都以分支数递增。
例如,如果您有四个分支,那么在Branch1上您可以设置
ID INT IDENTITY(1, 4) NOT NULL -- IDs will be 1, 5, 9...etc.
在Branch2上
ID INT IDENTITY(2, 4) NOT NULL -- IDs will be 2, 6, 10 ...etc
在Branch3上
ID INT IDENTITY(3, 4) NOT NULL -- IDs will be 3, 7, 11 ...etc
在Branch4上
ID INT IDENTITY(4, 4) NOT NULL -- IDs will be 4, 8, 12 ...etc.