用于处理动态分类法的专用多面搜索引擎 - 仅有助于性能还是灵活性?
-
21-09-2019 - |
题
一段时间以来,我一直在考虑如何使用类似于 eBay 的分类法和依赖于特定产品类别的属性来对典型的电子商务网站进行建模。
第一次尝试是在 EAV 和 Table Per Class 数据库继承建模之间进行选择。我选择后者是因为性能,但它的意思是为每个特定(类别树中的叶子)产品类别创建专用表,并将特定类别属性(例如电视的分辨率)建模为单独的列。
虽然性能良好,但如果您需要向现有类别添加属性或添加新类别,则此设置并不灵活。对于每个此类更改都需要以下内容:
- 更改/创建表
- 用于按特定属性过滤此类类别的新表单
- 用于生成用于搜索和过滤的数据库查询的新代码
- 一些新的视图模型/DTO 和用于展示新类别产品的视图
为了应对这种复杂性,我认为需要在 xml 甚至 excel 文件中对这些属性进行某种元表示(甚至在应用程序之外),以便在每次更改时都可以自动生成所有提到的代码(sql/orm 查询、应用程序代码、模板)。因此它可以帮助开发,但仍然需要测试和额外的部署。
那时我了解到 eBay 并没有真正使用关系数据库进行搜索,而且他们的分类非常灵活,他们可以很快添加新的叶类别。此外,它们的类别可能不是来自关系数据库中建模的分层树的类别,而只是搜索属性(方面)。
在快速浏览了最有前途的专用分面搜索设置(单独的 Solr 实例)之后,我不确定它是否可以帮助我灵活地应对分类法更改,因为通常 Solr 只是以某种方式镜像关系数据库,因此特定的类别属性仍然必须在数据库中建模为 DBMS 元数据,因此例如。动态生成用于过滤属性的 UI 表单将很困难,除非:
1)我将使用EAV fasion将数据保存在RDBMS中,并使用SOLR搜索克服其性能问题(但仍然存在EAV混乱、没有数据完整性强制等问题)
2)我会只保留属性字典(即只是它们的名称和类型)在 RDBMS 中,并将特定属性值存储在 SOLR 中,将其用作除搜索工具之外的非关系数据存储。我也不相信这个解决方案(即使它是可能的),因为应用程序将与 solr 紧密耦合(即。产品版管理员 CRUD 将直接与 SOLR 交互)。
你怎么看?您认为对于任何类型的此类(高性能)分类法灵活性,代码生成都是不可避免的吗?你会怎么处理?也许数据库中 EAV 风格的一些单独的数据字典只是用于代码生成目的?我想我也可以使用 MongoDB 之类的东西,但 UI 代码生成(运行时或非运行时)仍然需要某种元数据。
这里有很多问题,但我不想将其分解为更小的问题,因为我对处理更大类此类问题时的通用设计方法感兴趣。
解决方案
我并不声称对所有这些都有明确的答案(这是一个相当开放式的问题,您应该尝试将其分解为更小的部分,这取决于您的实际要求,事实上,我很想投票关闭它)但我会评论一些事情:
- 我会忘记在 RDBMS 上对此进行建模。 分面搜索在关系模式中不起作用.
- IMO 这不是代码生成的正确位置。您应该设计您的代码,使其不会随着数据更改而更改(我不是在谈论 图式 变化)。
- 在 Excel 电子表格上存储元数据/属性似乎是一个非常糟糕的主意。我将构建一个 UI 来编辑它,它将存储在 Solr / MongoDB / CouchDB / 无论您选择管理它的任何地方。
- 索尔 才不是 “只是镜像关系数据库”。事实上,Solr 完全独立于关系数据库。最常见的情况之一 是 将数据从 RDBMS 转储到 Solr(在此过程中对数据进行非规范化),但 Solr 足够灵活,可以在没有任何关系数据源的情况下工作。
- Solr 中的分层分面 仍然是研究中的一个悬而未决的问题。目前正在研究两种不同的方法(SOLR-64, SOLR-792)
其他提示
如果您对不同类型的产品有不同类型的类别怎么办?
以 eBay 为例,我们将 产品 那可以是 图书 或者 电视/显示器.
书籍有书名和 ISBN,并且可能属于科幻类别,或者属于色情类别,或者属于非小说类别,或者属于自传类别。或者,也许您有一本属于非小说类、自传体色情类别的书。
显示器有屏幕分辨率和功耗(?),并且可能属于平板类别、CRT 类别或高清类别。
从纯粹关系的角度来看,你可以 或许 像这样建模:
[Product]-(1)------(1)-[ Book ]-(n)------(m)-[ book_category ]
| id | | title | | name |
| price | | ISBN |
| ... |
| ... |-(1)---(1)-[ display ]-(n)------(m)-[ display_category ]
| resolution | | name |
| watts |
而不是建模 attributes dependent on a particular product category
, ,你会有不同的属性 和类别 依赖于 类型/类别 产品的。
看 超类型和亚类型