【发布时间】:2020-01-07 14:59:00
【问题描述】:
设计一个 PostgreSQL 数据库,该数据库将由使用 Sequelize 的 Node API 查询。目前,我有一个名为recipes 的表,其中包含名为ingredients 和instructions 的列。这些列存储为给定的字符串数组,如{Tomatoes, Onions}。
这种存储方法非常适合在客户端简单地获取和呈现配方。但它不适用于模糊搜索查询,因为使用 Sequelize 我所能做的就是ingredients: { [Op.contains] : [query] }。因此,如果用户键入tomatoes,则无法编写一个“模糊”搜索查询来返回包含Tomatoes 成分的食谱。
然后我在 PostgreSQL 文档中读到了这个:
数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用一个单独的表,其中每个项目将是一个数组元素。这将更容易搜索,并且对于大量元素可能会更好地扩展。
现在我正在考虑将ingredients 和instructions 存储为单独的表,但我有几个问题。
1) 由于一个食谱可以有多个相关的成分,我应该只为每个成分使用一个外键和 Sequelize hasMany 关系吗?这对我来说似乎是正确的,只是现在每次创建使用该成分的新配方时,我都有可能复制常见成分。
2) 编写模糊搜索查询的最佳方法是什么,以便用户可以搜索recipes 表的主要列(例如title、description)并将他们的查询附加到@ 987654337@ 和 ingredients 表?
基本上,我想最终将模糊搜索查询应用于三个看起来像这样的表......
const recipes = await req.context.models.Recipe.findAll({
where: {
[Op.or]: [
{ title: { [Op.iLike]: '%' + query + '%' } },
{ description: { [Op.iLike]: '%' + query + '%' } },
{ ingredients: { ingredient: { [Op.iLike]: '%' + query + '%' } } },
{ instructions: { instruction: { [Op.iLike]: '%' + query + '%' } } }
]
}
});
谢谢!
【问题讨论】:
-
嗨 joehdodd 您需要数据库规范化吗?如果是这样,这可能会帮助你en.wikipedia.org/wiki/First_normal_formen.wikipedia.org/wiki/Second_normal_formen.wikipedia.org/wiki/Third_normal_form
-
食谱有一种或多种成分并且成分在一个或多种食谱中听起来如何?如果是这样,您将拥有表:食谱、表:成分(链接表)和表:成分。所以成分将保存配方键和成分键,这两个键都是其他表中的主键。
标签: node.js postgresql sequelize.js