【问题标题】:How to ensure consistency between lookup table in database and front-end code?如何保证数据库中的查表与前端代码的一致性?
【发布时间】:2021-10-05 11:06:51
【问题描述】:

我有一个护肤品类别的查找表,看起来像这样(整数 ID 和字符串名称)

表中只有 9 个字段,使用种子脚本填充,因为护肤品的类别只有这么多,尽管此表偶尔会更改(例如,我可能将油性清洁剂和清洁剂合并为一个类别) .

我将其用作查找表以在product 表中指定产品类别。

这些类别在 UI 代码中使用(例如填充下拉菜单),为此我也在我的 UI 代码中保留了一组类别。这感觉是重复的,我希望有一个单一的事实来源。

const categoryLabelsAndOrder = {
  OIL_CLEANSER: { label: "Oil cleanser", sortKey: 1 },
  CLEANSER: { label: "Cleanser", sortKey: 2 },
  TONER: { label: "Toner", sortKey: 3 },
  // ...
};

但是,我还需要以某种方式保留特定于 UI 的逻辑(例如 label,它是在 UI 上显示的文本或 sortKey,它控制它们的显示顺序),并且可能是将这些字段存储在数据库中是一种不好的做法。

如果我忘记在数据库和 UI 代码中更新它们,可能会导致错误。

我该如何解决这个问题?

我研究过使用enum 类型,但据我发现,它们应该用于永远不会改变的字段。 enums 也没有完全解决我的问题。

我是否应该使用从categories 表中获取的数据在categoryLabelsAndOrder 的代码中运行某种类型的验证,以便对象中的键与categories 中的键完全匹配?这听起来也是多余的,尤其是因为我必须从这个表(以及所有其他查找表)中获取数据来验证一致性。

我正在使用 Prisma 和 PostgreSQL,但这个问题与数据库解决方案或 ORM 无关。

【问题讨论】:

  • "...我想要一个单一的事实来源..." - 我遇到过几次这个问题。我通常做的是其中一个源实际上是从另一个源生成/刷新的;这是由构建过程或其他事件触发的。这样,您始终拥有单一的事实来源。这可以应用于关键信息的两个、三个、四个或更多副本。

标签: database


【解决方案1】:

你可以这样做:

在类别表中添加两列,一列用于UI中的名称,一列用于对UI中的类别进行排序,这样您就可以获取UI名称并更改顺序(排序键),也可以在其中添加更多语言未来。

我希望我能很好地理解这一点。

【讨论】:

    【解决方案2】:

    将 sortKey 和 UI 标签存储在数据库中比在 UI 代码库中存储产品的整个副本更糟糕的做法是什么? sortKey 看起来与 ID 相关联,并且可以使用以下算法生成标签:

    name = name.charAt(0) + name.slice(1).replace('_', ' ').toLowerCase();
    

    【讨论】:

      【解决方案3】:

      如果您要查找多种语言,则仅在表格中为名称添加一个额外字段可能会给您带来麻烦。

      我会这样做

      categories
      
      
      id | name
      ==================
      1  | OIL_CLEANSER
      2  | CLEANSER
      3  | TONER
      
      

      然后我将有一个单独的翻译文件,格式取决于您使用的库/框架。数据将按原样返回。

      translations.en.json
      
      {
          "OIL_CLEANSER": "Oil cleanser",
          "CLEANSER": "Cleanser",
          "TONER": "Toner",
      }
      
      translations.zn.json
      translations.my.json
      ...
      

      前端代码只会呈现翻译。这样,事实总是在数据库中,呈现的总是翻译,您可以将翻译文件传递给翻译人员进行相应的添加/更新。

      e.g
      
      translated = translation[curr_lang].json
      
      for cat in categories
         console.log(translated[cat.name])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2014-08-27
        • 2016-04-13
        相关资源
        最近更新 更多