具有用户数据和中央数据库更新的数据库设计
Database design with user data and central database updates
我正在设计 windows 桌面应用程序。它使用 LiteDB 作为用户的单个文件本地数据库——将它用作具有外键等的关系数据库(每个 Table 都有一个整数 ID 作为主键并通过 FK 引用其他 tables整数)。
这是一款复古游戏应用,因此 'tables' 将包含以下内容:
系统(例如"Sony PlayStation"、"Nintendo 64")
控制器(例如"Sony Dual Shock")
对照(例如"Cross"、"Start"、"Select")
由于上述原因,我将不得不坚持使用整数 ID 作为主键 - 我虽然考虑使用 'name',但这不适用于控件(即 Start 将在许多控制器)。
用户应该可以根据自己的意愿添加和删除记录(尽管删除会令人气馁'standards')
挑战在于我还将在我的服务器上托管一个 mysql 数据库,允许用户从中更新他们的 table。现在这是我无法理解的一点。
假设他们将系统 "Casio Watch" 添加到本地 table。这将获得一个自动生成 ID(例如“94”)。同时,服务器数据库发生了一些更新并添加了一个新系统(例如 "Commodore Calculator"),这也获得了“94”的自动生成 ID。那是第一个冲突。
您可以通过将其作为新行附加到用户数据库中来解决上述问题 - 在其中获取新 ID。但我的第二个担心是外键。假设有一个 'Manufacturers' table 和一个 'Biggest Seller' 字段。现在在服务器上,对于 Manufacturer = Commodore,'Biggest Seller' FK 对于 "Commodore Calculator" 是 94 但是,如果将这个 Manufacturer table 导入到用户本地数据库中,那么 Commodore 的最大卖家将是 "Casio watch" - 它在用户数据库上的 ID 为 94。
如果我说得有点慢,请原谅我。参照完整性正在浮现在脑海中(是 update/null FKs 的变化吗??)但我不认为你可以通过 LiteDB 做到这一点(即一个变化不会级联到相关 table)。
如有任何建议,我们将不胜感激。
如您准确所述,使用简单的自动递增字段将不起作用。
在相关表格中添加一个 "server id" 字段来标识数据来自的计算机/安装,并确保该字段在所有安装中都是唯一的。您需要跨多个数据库同步的每个系统/制造商/等都将有一个复合主键,由服务器 ID 和一个自动增量值组成(尽管,您可能需要一个单独的生成器来在本地创建自动增量)。因此,"Casio Watch" 的服务器 ID 为 1,自动递增值为 94。"Commodore Calculator" 具有相同的自动递增值,但其服务器 ID 不同,因此不会发生冲突。
另一种选择是使用通用唯一 ID (UUID) 而不是简单的自动递增字段。 UUID 保证在所有 mysql 安装中是唯一的(有一些限制)。在mysql中可以使用uuid()函数生成uuid。
从系统设计的角度来看,UUID 更简单,因为 mysql 在上述 link 中描述的某些限制内保证其唯一性。但是,UUID 需要更多存储空间 space 并且会有 .
我正在设计 windows 桌面应用程序。它使用 LiteDB 作为用户的单个文件本地数据库——将它用作具有外键等的关系数据库(每个 Table 都有一个整数 ID 作为主键并通过 FK 引用其他 tables整数)。
这是一款复古游戏应用,因此 'tables' 将包含以下内容:
系统(例如"Sony PlayStation"、"Nintendo 64")
控制器(例如"Sony Dual Shock")
对照(例如"Cross"、"Start"、"Select")
由于上述原因,我将不得不坚持使用整数 ID 作为主键 - 我虽然考虑使用 'name',但这不适用于控件(即 Start 将在许多控制器)。
用户应该可以根据自己的意愿添加和删除记录(尽管删除会令人气馁'standards')
挑战在于我还将在我的服务器上托管一个 mysql 数据库,允许用户从中更新他们的 table。现在这是我无法理解的一点。
假设他们将系统 "Casio Watch" 添加到本地 table。这将获得一个自动生成 ID(例如“94”)。同时,服务器数据库发生了一些更新并添加了一个新系统(例如 "Commodore Calculator"),这也获得了“94”的自动生成 ID。那是第一个冲突。
您可以通过将其作为新行附加到用户数据库中来解决上述问题 - 在其中获取新 ID。但我的第二个担心是外键。假设有一个 'Manufacturers' table 和一个 'Biggest Seller' 字段。现在在服务器上,对于 Manufacturer = Commodore,'Biggest Seller' FK 对于 "Commodore Calculator" 是 94 但是,如果将这个 Manufacturer table 导入到用户本地数据库中,那么 Commodore 的最大卖家将是 "Casio watch" - 它在用户数据库上的 ID 为 94。
如果我说得有点慢,请原谅我。参照完整性正在浮现在脑海中(是 update/null FKs 的变化吗??)但我不认为你可以通过 LiteDB 做到这一点(即一个变化不会级联到相关 table)。
如有任何建议,我们将不胜感激。
如您准确所述,使用简单的自动递增字段将不起作用。
在相关表格中添加一个 "server id" 字段来标识数据来自的计算机/安装,并确保该字段在所有安装中都是唯一的。您需要跨多个数据库同步的每个系统/制造商/等都将有一个复合主键,由服务器 ID 和一个自动增量值组成(尽管,您可能需要一个单独的生成器来在本地创建自动增量)。因此,"Casio Watch" 的服务器 ID 为 1,自动递增值为 94。"Commodore Calculator" 具有相同的自动递增值,但其服务器 ID 不同,因此不会发生冲突。
另一种选择是使用通用唯一 ID (UUID) 而不是简单的自动递增字段。 UUID 保证在所有 mysql 安装中是唯一的(有一些限制)。在mysql中可以使用uuid()函数生成uuid。
从系统设计的角度来看,UUID 更简单,因为 mysql 在上述 link 中描述的某些限制内保证其唯一性。但是,UUID 需要更多存储空间 space 并且会有