【发布时间】: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