数据库设计与用户数据和中央数据库更新

dpiehjr4  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(328)

我正在设计一个windows桌面应用程序。它使用litedb作为用户的单文件本地数据库,非常像一个带有外键的关系数据库(每个表都有一个整数id作为主键,并通过fk integers引用其他表)。
这是一款复古游戏应用程序,因此“表”将包括以下内容:
系统(例如“sony playstation”、“nintendo 64”)
控制器(例如“sony dual shock”)
控制(例如“交叉”、“开始”、“选择”)
由于上述原因,我将不得不坚持使用整数ID作为主键-我认为应该使用'name',但这对控件不起作用(即在许多控制器上都可以找到start)。
用户应该能够根据自己的意愿添加和删除记录(尽管删除“标准”会有不好的效果)
挑战在于,我还要在服务器上托管一个mysql数据库,允许用户从中更新他们的表。现在这一点我想不通了。
假设他们在本地表中添加了一个系统“casiowatch”。这将得到一个自动生成id(比如'94')。同时,服务器数据库上发生了一些更新,并添加了一个新系统(例如“commodore calculator”),这也得到了“94”的自动生成id。这是冲突号1。
您只需在user db中添加一个新行就可以绕过上述问题—在其中获得一个新的id。但我的第二个担心是外键。假设有一个“制造商”表和一个“最大卖家”字段。现在在服务器上,对于manufacturer=commodore,“最大卖家”fk对于“commodore calculator”是94,但是,如果将这个manufacturer表导入到用户本地db中,那么commodore的最大卖家将是“casio watch”—在用户db上它的id是94。
如果我对这一切有点迟钝,请原谅。我想到了引用完整性(是不是有update/null fks on change??),但我不认为您可以通过litedb来做到这一点(即,一个表中的更改不会级联到相关表)。
任何建议都将不胜感激。

h6my8fg2

h6my8fg21#

使用一个简单的自动递增字段将不能像您准确地说明的那样工作。
在相关表中添加一个“服务器id”字段,标识数据来自的计算机/安装,并确保此字段在所有安装中都是唯一的。需要跨多个数据库同步的每个系统/制造商/etc都有一个复合主键,由服务器id和一个自动递增的值组成(不过,您可能需要一个单独的生成器在本地创建自动递增)。因此,“casiowatch”的服务器id为1,自动递增值为94。“commodore calculator”将具有相同的自动增量值,但其服务器id将不同,因此不会发生冲突。
另一个选项是使用通用唯一id(uuid),而不是简单的自动递增字段。uuid在所有mysql安装中都是唯一的(有一些限制)。在mysql中,可以使用uuid()函数生成uuid。
从系统设计的Angular 来看,uuid更简单,因为mysql在上面链接中描述的某些限制内保证了它的唯一性。然而,uuid需要更多的存储空间,这将对innodb的性能产生负面影响。

相关问题