Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 存储和查询具有多个相关实体的PostgreSQL数据库实体?_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Node.js 存储和查询具有多个相关实体的PostgreSQL数据库实体?

Node.js 存储和查询具有多个相关实体的PostgreSQL数据库实体?,node.js,postgresql,sequelize.js,Node.js,Postgresql,Sequelize.js,使用Sequelize设计一个节点API查询的PostgreSQL数据库。目前,我有一个名为recipes的表,其中有一列名为配料和说明。这些列存储为一个给定的字符串数组,如{西红柿,洋葱} 这种存储方法对于在客户端简单地获取和呈现配方来说效果很好。但它在模糊搜索查询中效果不佳,因为使用Sequelize我所能做的就是成分:{[Op.contains]:[query]}。因此,如果用户键入西红柿,则无法编写“模糊”搜索查询,返回含有配料西红柿的配方 然后我在PostgreSQL文档中读到: 数组

使用Sequelize设计一个节点API查询的PostgreSQL数据库。目前,我有一个名为
recipes
的表,其中有一列名为
配料
说明
。这些列存储为一个给定的字符串数组,如
{西红柿,洋葱}

这种存储方法对于在客户端简单地获取和呈现配方来说效果很好。但它在模糊搜索查询中效果不佳,因为使用Sequelize我所能做的就是
成分:{[Op.contains]:[query]}
。因此,如果用户键入
西红柿
,则无法编写“模糊”搜索查询,返回含有配料
西红柿
的配方

然后我在PostgreSQL文档中读到:

数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更容易搜索,并且对于大量元素可能具有更好的扩展性

现在我正在考虑将
成分
说明
存储为单独的表格,但我有几个问题

1) 由于配方可能有多个相关成分,我是否应该为每个成分使用外键,并且Sequelize
有许多关系?对我来说,这似乎是正确的,只是我现在有可能在每次创建一个使用普通成分的新配方时复制普通成分

2) 编写模糊搜索查询的最佳方法是什么,以便用户可以搜索
配方
表的主列(例如
标题
说明
),并将其查询应用于
说明
配料

基本上,我希望最后得到一个模糊搜索查询,它应用于三个表,看起来像这样

const recipes=wait req.context.models.Recipe.findAll({
其中:{
[点评]:[
{title:{[Op.iLike]:'%'+query+'%'}},
{说明:{[Op.iLike]:'%'+query+'%'}},
{成分:{成分:{[Op.iLike]:'%'+query+'%'}},
{指令:{指令:{[Op.iLike]:'%'+query+'%'}}
]
}
});

谢谢

我已经这样做了,我碰巧在sequelize的节点层中使用了graphql,并且我有一些过滤器对象来做这类事情。你只需要在你的回信中写一些include语句。findAll。。在初始where子句之后,您将评估是搜索标题还是描述,还是同时搜索这两种类型的内容。我发送了带有前缀的搜索参数,我可以去掉这些前缀,告诉我我想在它们上使用什么sequelize op,然后通过一个实用方法运行参数来创建我的where子句,但我知道有很多方法可以剥猫皮。我只是不想把我的解析器弄得乱七八糟,堆积如山的硬编码ops和条件从句都是。。。。您的include可能看起来像这样

    include: [{
              model: models.Ingredient,
              as: 'Ingredients',
              through: { some join table specifying keys where necessary since this 
                         is many to many }
              where: {some conditional code around your search param},
            }, {
              model: models.Instruction,
              as: 'Instructions',
              where: {some conditional code around your search param},
            }],
sequelize文档中有关于多个包含或嵌套包含的好文档,但是从上面我看到的,您对需要做什么有相当好的理解。为了简单一点,我会先从recipie(title,description)中搜索字段,然后再添加include并使其工作,这样会更清楚地知道如何形成where子句

交替地。。您可以跳过模型中的include并编写关联,使用getter调用它们,并将where子句传递给那些。。。我现在也这么做了,而且有很好的文档记录。。Sequelize确实提升了他们的游戏水平

Recipie.associate = function (models) {
    models.Recipie.hasMany(models.Ingredient, { as: 'Ingredients', through: "recipie_ingredient" foreignKey: 'recipie_id'});
  };

现在你有了一个成分的getter,如果你在成分模型中声明belongtomany指向Recipie,那么你也会有一个getter,你可以通过where子句将搜索字符串传递给该getter,并获得所有具有给定成分或成分列表类型的Recipe。。。。清除为泥浆?

您好,joehdodd,您需要数据库正常化吗?如果是这样的话,这可能会帮助你,食谱如何包含一种或多种成分,以及成分如何包含在一种或多种食谱中?如果是这样的话,你会有表:配方,表:配料(链接表)和表:配料。因此,配料将包含配方键和配料键。这两个键都是其他表中的主键。谢谢!我认为第二种选择是我可能会去的地方,因为当我定义我的
Recipe
模型时,我已经有了一些这样的选择。我的搜索查询目标是在客户端实现它,这样用户就可以取回与他们的查询相关的任何配方,无论
标题
说明
成分
说明
是否匹配。我的前半部分用于
title
description
,但由于我最初的数据库设计,我发现我无法对我的
成分
说明
列进行如此强大的查询,因此遇到了障碍。