如何设计一个具有各种属性和多个编辑器的可搜索,版本化的项目库?

时间:2012-02-05 00:54:14

标签: database-design architecture

我需要什么:

我正在设计产品库的后端,该产品库必须满足以下要求:

  1. 多位编辑将同时编辑不同的项目 - 必须有某种项目级锁定。

  2. 项目属性大不相同 - 大约有100个子类别,每个子类别可以有10多个特定于自身的项目属性。

  3. 必须对整个商品商店进行版本控制 - 在将整组更改发布到网站之前,可以进行多项更改(插入,编辑和删除);也必须取消发布。

  4. 我必须能够搜索所有属性并按其中一些过滤 - 即在库中的任何位置查找关键字或查找满足一组条件的所有产品 - 至少在一个数据集中10MB(即5000件,每件2KB),可能两倍。

  5. 解决方案应该是特定于MySQL的,或者更好的是与供应商无关。

    我考虑过的事情:

    我正在考虑使用单个大型XML对象,其中包含存储在数据库中的所有项目(以满足 2 )(以满足 3 ),但这会使 1 不可能, 4 困难。我之前使用过这样的东西,但是使用较小的XML对象而没有项目级锁定。

    我正在考虑的另一个解决方案是使用每个子类别的单独表格的经典数据库解决方案,这使得 1 2 琐碎,但 3 < / strong>和 4 相当困难。考虑到不同子类别的数量以及数据库中不同表的数量,它也有点笨拙,但我想这可以自动化。

    另一种可能性是两者之间的混合,具有所有项目的单个大型数据库表。每行包含一个XML对象,其中包含所有项的属性,另外还包含所有可过滤的属性作为表字段。这解决了 1 2 并部分解决了 4 ,但没有进行全文搜索,仍然使 3 相当困难实现。

    如果你到目前为止:

    我可能需要几周的时间来解决它,这应该留出足够的时间进行讨论。我将非常感谢SO社区可以提供的任何想法和见解。提前谢谢。

4 个答案:

答案 0 :(得分:3)

选项2 - 您概述的经典数据库解决方案适用于此案例。

它照顾1,2 [有点困难,但你可以通过设计小gereric mannager来克服其中的大部分],3。

对于第4点,我建议您使用Apache Solr进行探索,它可以轻松地与RDBMS集成,可以索引数据,并且比SQL快100倍。

答案 1 :(得分:2)

couchbase

它符合您的所有要求

  1. 使用多版本并发控制来管理对数据库项的并发访问并强制执行一致性,但可以使用建议锁来限制对一个客户端的项的访问。
  2. 架构灵活
  3. 版本很容易实现http://blog.couchbase.com/simple-document-versioning-couchdb
  4. 支持map-reduce和视图,以便您可以获取数据(需要注意的是查询不是特定的)

答案 2 :(得分:1)

我认为混合模式最有希望。

具体来说,我会将关系模型用于您的应用程序需要能够推理的数据 - 我将在此关系模型中包含版本控制和锁定逻辑。

我会使用XML或类似的方法来存储应用程序不需要推理的数据。

对于搜索和过滤,我会使用专用的搜索引擎 - 像Lucene或类似的东西。我将Lucene索引作为“发布新版本”例程的一部分进行管理。当然,您可以使用数据库服务器的内置自由文本搜索,而不是Lucene。

我不会尝试将相同的数据模型用于“事务”逻辑和搜索/过滤 - 它们是不同的任务,并且很难管理大量的模式变体。

答案 3 :(得分:0)

通过直接寻找关系数据库或XML文件来实现持久性,您似乎对自己有所帮助。您是否考虑过NoSQL或多语言持久层? NoSQL有许多不同的风格,具有不同的优点和缺点。 Martin Fowler最近发布了一个非常高级overview的NoSQL数据库和多语言持久性,你可能会觉得很有启发性。

除了使用关系数据库进行持久化之外,我没有任何个人经验,但我已经完成了一些关于NoSQL和多语言持久性的阅读,我渴望编写一个解决方案来解决这个概念

希望有所帮助。