2012-11-28 73 views
1

这个问题更多的是关于代码的体系结构和想法。针对分布式数据库的解决方案/设计,具有时间同步的PK/FK解决方案

问题: 让我们有一个存储所有内容的后端主数据库。 然后我们有一个前端本地数据库(SQLLite或类似的),它只存储用户/设备的相关数据。

用户可以在前端创建数据。但是,有几个用户可以同时创建同一种类型(即收据),如果我们使用简单的int自动增量PK,则后端会发生冲突。

提出的解决方案是: 我们使用复合PK,其中所述PK组成: -autoincrement整数 -device ID -user ID

现在,logicaly,设备ID和用户ID应该是FK到设备和用户表,但是由于几个原因,在每个前端设备上存储所有设备/用户不可行/不可行,所以FK使其成为问题。

建议的解决方案是为了省略FK请求并仅在后端检查数据完整性,但说实话,我不确定风险/收益是否值得。

有没有人对此有所了解和/或在部署后有一些经验? 你有什么想法? 非常感谢。

回答

0

弗拉德,

我认为你试图解决的难题是:设备如何产生跨所有设备唯一标识符?过去对这个问题的回答是创建一个“全球唯一标识符”(GUID)或一个“通用唯一标识符”(UUID),它包含了唯一标识信息,如“设备ID”,“时间戳”和随机数。这样做的IETF标准可以在这里找到:RFC4122。因此,大多数数据库供应商至少提供了一个UUID()或GUID()SQL函数来返回这些唯一标识符之一。顺便说一句,我不知道SQLLite是否提供了一个,但我知道SequelSphereDB确实提供了一个UUID()函数。最终结果是您可以使用这些来为行创建唯一的标识符。

因此,不是具有由数字,设备ID和用户ID组成的组合主键,而是具有单个列CHAR(36),其存储在行时在行进中生成的UUID创建。

UUID优点:

  • 单柱
  • 在客户端生成,而不需要接触的任何其它装置
  • “保证”是唯一的,或者至少要比备用的可能性更是这样。

UUID缺点:

  • 柱储存大:CHAR(38)。
  • 与替代关键型单向发生器相比,发电速度较慢。
+1

SQLite不提供UUID或GUID函数,但现在大多数编程语言都这样做。因此,您可以在应用程序代码中生成GUID,然后将其存储在SQLite数据库中。你*可以*在C中创建一个函数并将其编译到SQLite中,但我认为这通常比它的价值更麻烦。 –

+0

很高兴知道。谢谢! –