Database design 如何为用户可编辑字段设计数据库模型?

Database design 如何为用户可编辑字段设计数据库模型?,database-design,Database Design,我正在尝试设计一个数据库模型,用户可以自由编辑字段,我可以验证更改并合并它们。这里在堆栈溢出上使用了类似的用户管理模型,其他人可以编辑答案并改进它们。只有在批准后,编辑才会自动应用 这是我正在使用的模型,其中包含多个UUID对象的开关对象或阵列: { "switches": { "UUID": { "created": "date", "force": { "operating": "55g", "peak": "95g"

我正在尝试设计一个数据库模型,用户可以自由编辑字段,我可以验证更改并合并它们。这里在堆栈溢出上使用了类似的用户管理模型,其他人可以编辑答案并改进它们。只有在批准后,编辑才会自动应用

这是我正在使用的模型,其中包含多个UUID对象的开关对象或阵列:

{
  "switches": {
    "UUID": {
      "created": "date",
      "force": {
        "operating": "55g",
        "peak": "95g"
      },
      "rating": {
        "current": "10mA",
        "maximum": "12V maximum AC/DC"
      },
      "type": "tactile",
      "lifespan": "50 million"
    }
  }
}
这也带来了自身的挑战:

我如何保持这一点易于管理?
我需要一个清楚的方法来知道哪些属性被改变了,哪些没有。 我需要能够合并对象,但只合并已更改的属性。在某种程度上,就像git跟踪历史一样,我需要跟踪对象以前的编辑

一种办法是:

  • 在每次编辑时,将创建原始对象的副本,并仅在原始对象中引用编辑过的对象UUID

  • 然后在“控制面板”中,对两个对象进行代码比较,比较它们的创建日期和编辑日期,并合并从已编辑对象更改的属性

  • 但这行不通,因为

  • 在多人更改字段的情况下对属性进行多次编辑会使合并变得困难
  • 随着时间的推移,它会变得杂乱无章,因为我会将编辑过的对象和原始对象放在同一个位置,对它们进行排序会花费越来越多的时间
  • 这不允许我随时间跟踪更改,因为所有内容都将合并到原始对象中
  • 有没有更好的方法来处理引用?是否每个字段都有对已编辑对象的已编辑属性的引用


    我是数据库设计新手,我的项目现在没有数据库设置,所以我可以选择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函数查找谁更改了什么。

    我将创建一个历史记录表,每次