Database design 如何为用户可编辑字段设计数据库模型?
我正在尝试设计一个数据库模型,用户可以自由编辑字段,我可以验证更改并合并它们。这里在堆栈溢出上使用了类似的用户管理模型,其他人可以编辑答案并改进它们。只有在批准后,编辑才会自动应用 这是我正在使用的模型,其中包含多个UUID对象的开关对象或阵列:Database design 如何为用户可编辑字段设计数据库模型?,database-design,Database Design,我正在尝试设计一个数据库模型,用户可以自由编辑字段,我可以验证更改并合并它们。这里在堆栈溢出上使用了类似的用户管理模型,其他人可以编辑答案并改进它们。只有在批准后,编辑才会自动应用 这是我正在使用的模型,其中包含多个UUID对象的开关对象或阵列: { "switches": { "UUID": { "created": "date", "force": { "operating": "55g", "peak": "95g"
{
"switches": {
"UUID": {
"created": "date",
"force": {
"operating": "55g",
"peak": "95g"
},
"rating": {
"current": "10mA",
"maximum": "12V maximum AC/DC"
},
"type": "tactile",
"lifespan": "50 million"
}
}
}
这也带来了自身的挑战:
我如何保持这一点易于管理?我需要一个清楚的方法来知道哪些属性被改变了,哪些没有。 我需要能够合并对象,但只合并已更改的属性。在某种程度上,就像git跟踪历史一样,我需要跟踪对象以前的编辑 一种办法是:
我是数据库设计新手,我的项目现在没有数据库设置,所以我可以选择sql或nosql 如果我理解你的答案,我会做以下事情: 将所有用户标记为Json文件 将更改(包括之前的值)保存为单独的Json,然后将更改应用于原始文件。 还有一个SQLite数据库或类似的东西,它知道所有JSON文件名 要注意这些变化,您只需要使用Before JSON和After,并比较所有相等的值
快乐编码 如果我理解你的答案,我会做以下事情: 将所有用户标记为Json文件 将更改(包括之前的值)保存为单独的Json,然后将更改应用于原始文件。 还有一个SQLite数据库或类似的东西,它知道所有JSON文件名 要注意这些变化,您只需要使用Before JSON和After,并比较所有相等的值 快乐编码 这通常被称为a;您的数据库引擎可能具有内置支持。谷歌时态数据库还将提供专门为您的用例设计的解决方案 有几种方法可以对此进行建模。我的首选是使用“有效期自/有效期至”字段 因此,您的表结构可能类似于:
Switch:
-------------
UUID (pk)
valid_from (pk)
valid_until
approved_flag
Created
operating_force
operating_peak_force
rating_current
rating_maximum
type
lifespan
当用户创建记录时,valid\u from
是创建日期<代码>在为空之前有效。当您获得记录的新版本时,您将有效期设置为修改日期,并创建一个新行,其中有效期设置为修改日期,并且有效期设置为空
这允许您查看记录在任何时间点的状态;通过比较current和current-1,可以看到delta是什么
挑战在于“如果两个人同时修改一个记录,谁会赢”。通过在UUID和valid_from上创建复合主键,在两个人完全同时进行更改的极不可能的情况下,其中一个将被拒绝。但是,在用户加载屏幕、修改数据和尝试保存数据之间,记录可能会发生变化
要处理这种情况,您可以包含应用程序逻辑,以便在尝试修改该字段时,将加载时的有效值与该字段进行比较;如果它们不同,UI可以提醒用户。这通常称为;您的数据库引擎可能具有内置支持。谷歌时态数据库还将提供专门为您的用例设计的解决方案
有几种方法可以对此进行建模。我的首选是使用“有效期自/有效期至”字段
因此,您的表结构可能类似于:
Switch:
-------------
UUID (pk)
valid_from (pk)
valid_until
approved_flag
Created
operating_force
operating_peak_force
rating_current
rating_maximum
type
lifespan
当用户创建记录时,valid\u from
是创建日期<代码>在
为空之前有效。当您获得记录的新版本时,您将有效期设置为修改日期,并创建一个新行,其中有效期设置为修改日期,并且有效期设置为空
这允许您查看记录在任何时间点的状态;通过比较current和current-1,可以看到delta是什么
挑战在于“如果两个人同时修改一个记录,谁会赢”。通过在UUID和valid_from上创建复合主键,在两个人完全同时进行更改的极不可能的情况下,其中一个将被拒绝。但是,在用户加载屏幕、修改数据和尝试保存数据之间,记录可能会发生变化
要处理这种情况,您可以包含应用程序逻辑,以便在尝试修改该字段时,将加载时的有效值与该字段进行比较;如果它们不同,UI可以提醒用户。我将创建一个历史记录表,每次主表仅保存最新记录(无论哪个字段发生更改),以前的记录都会通过表触发器转到历史记录表
然后,您可以使用diff函数查找谁更改了什么。我将创建一个历史记录表,每次