我一直在考虑使用类似 ebay 的分类法和依赖于特定产品类别的属性来建模典型的电子商务网站。
第一次尝试是在 EAV 和 Table Per Class db 继承建模之间进行选择。我选择后者是因为性能,但这意味着为每个特定(类别树中的叶子)产品类别创建专用表,并将特定类别属性(如电视的分辨率)建模为单独的列。
如果您需要将属性添加到现有类别或添加新类别,则此设置虽然高效,但并不灵活。对于每个此类更改,需要以下内容:
- 更改/创建表
- 按特定属性过滤此类类别的新表格
- 用于生成用于搜索和过滤的数据库查询的新代码
- 一些新的视图模型/DTO 和用于展示新类别产品的视图
为了应对这种复杂性,我认为需要在 xml 甚至 excel 文件中(甚至在应用程序之外)对这些属性进行某种元表示,以便在每次更改时都可以自动生成所有提到的代码(sql/orm 查询,应用程序代码、模板)。所以它可以帮助开发,但仍然需要测试和额外的部署。
那时我了解到 ebay 并没有真正使用关系数据库进行搜索,而且他们的分类非常灵活,可以很快添加新的叶子类别。此外,它们的类别可能不是在关系数据库中建模的分层树中的类别,而只是搜索属性(方面)。
在快速浏览了最有希望的专用分面搜索设置(单独的 Solr 实例)后,我不确定它是否可以帮助我灵活地应对分类变化,因为通常 Solr 只是以某种方式反映关系数据库,因此特定的类别属性仍然必须在 DB 中建模为 DBMS 元数据,例如。用于过滤属性的动态生成 UI 表单会很困难,除非:
1)我将使用 EAV fasion 将数据保存在 RDBMS 中,并通过使用 SOLR 搜索来克服其性能问题(但仍然存在 EAV 混乱、没有数据完整性执行等问题)
2)我会在 RDBMS 中只保留属性字典(即它们的名称和类型),并将特定属性值存储在 SOLR 中,使用它作为一种非关系数据存储,而不是搜索工具。我也不相信这个解决方案(即使它是可能的),因为应用程序将与 solr 紧密耦合(即产品版本管理员 CRUD 将直接与 SOLR 交互)。
你怎么认为?您认为对于任何类型的(高性能)分类法灵活性代码生成是不可避免的吗?你会怎么处理?也许只是为了代码生成目的,在数据库中以 EAV 方式的一些单独的数据字典?我想我也可以使用 MongoDB 之类的东西,但是 UI 代码生成(运行时与否)仍然需要某种元数据。
这里有很多问题,但我不想把它分解成更小的问题,因为在处理更大类的此类问题时,我对通用设计方法感兴趣。