当您需要有关构面结果的其他数据时,最佳做法是什么。
即。对于产品类别,我需要一个friendlyname / image / meta关键字/ description /等等。 (当分面时)
谢谢,
REMCO
答案 0 :(得分:2)
BTW Lucene,它是Solr的底层,实际上也是NoSQL类型的存储设施。
如果我是你,我会使用MongoDB。这是我想到的第一个数据库,因为你需要二进制数据并且他们实际上发明了BSON,现在这种传播方式普遍意味着以类似JSON的方式传输二进制数据。
如果您的数据结构更像图形(如社交网络),请查看Neo4j,它具有快速的图形遍历算法。
答案 1 :(得分:1)
关系数据库可以可靠地强制执行“类别是第一类实体”的事情。您需要参照完整性:产品可能不属于不存在的类别。删除的类别不得包含其子类别。规范化的RDB可以通过模式强制引用完整性。 NoSQL DB必须使用客户端代码(您必须编写)来强制引用完整性。
让我们看看“产品类别必须存在”和“子类别父母必须存在”的方式如下:
RDB :为产品分配类别的表格(m:n关系)必须按ON DELETE CASCADE
键入产品和类别。如果删除某个类别,则产品根本无法拥有此类别。作为子项链接到另一个类别的类别:relavent字段具有ON DELETE CASCADE
。这意味着如果删除父项,则其子项不能存在。这整个方法都是声明性的(“因此声明它”),数据中存在所有复杂性,我们不需要为我们做的臭味代码。您可以自然地模拟数据库 ,了解它们对现实世界的影响。
文档存储类型NoSQL :您需要编写代码来执行所有操作。 “类别已删除”是用例,您需要查找具有该类别的产品,并更新每个类别。您必须为每个用例编写代码。管理子类别也是如此。数据模型可能非常愚蠢,但它们的真实含义必须在代码中建模。而且更难以理解代码和控制流而不是数据结构。
您真的是否有需要NoSQL数据库的性能需求?
因此,使用RDBMS来管理您的数据。然后使用直接导入处理程序或客户端代码插入/更新非规范化实体以进行搜索。如果您的网站上的大多数请求都可以在Solr查询中表达,那太好了!
至于在Solr中表达层次结构分面,请参阅“Ways to do hierarchial faceting in Solr?”。
答案 2 :(得分:0)
我会考虑两种选择:
1。)强化每个文档的信息而不对其进行索引(以尽可能保持索引较小)。关键是,我不会存储图像洞察Lucene / Solr - 只有文件指针。
2.)将附加数据存储在rdbms或nosql(linke mongoDB)上进行查找,如您所写。
我最喜欢的是第二名。一,因为数据库是传统的,最优化的数据存储方式。 但最终它取决于您的系统,因为您应该记住,您需要时间连接数据库,搜索数据并将其他信息发送回应用程序。 因此,将所有内容存储在lucene上会更快。
可能小的性能测试会很有用。
答案 3 :(得分:0)
也许我错了,但是如果你在Solr主干上,你可以从Solr join suport中受益,这将允许你为几个实体建立关系,同时对两者实施条件。