zga*_*ll1 6 sql attributes filtering object nosql
我即将开始一项超出正常职责范围的工作项目.作为一个SQL DBA,我最初的倾向是使用SQL数据库来接近项目,但是我对NoSQL的了解越多,我就越认为它可能是更好的选择.我希望我能用这个问题在高层次上描述项目,以获得关于使用每个选项的利弊的一些反馈.
该项目相对简单.我有一组具有各种属性的对象.其中一些属性对于所有对象是通用的,而一些属性仅对于对象的子集是通用的.我负责构建的是一种服务,其中用户选择一系列基于对象属性的过滤器,然后返回与所有过滤器匹配的对象列表.当用户选择过滤器时,他或她可能在公共或子集属性上进行过滤,但是在前端被抽象.
^根据用户反馈,有可能对象列表可能只匹配某些过滤器,并且匹配的质量将通过指示有多少标准匹配的分数显示给用户.
在看了Martin Folwler的这个演讲之后(http://www.youtube.com/watch?v=qI_g07C_Q5I),看起来文档式的NoSQL数据库应该适合我的需求,但鉴于我没有这种方法的经验,我也有可能遗漏一些明显的东西.
一些附加信息 - 数据库最初将有大约5,000个对象,每个对象包含10到50个属性,但对象数量肯定会随着时间的推移而增长,属性数量可能会根据用户反馈而增长.此外,我希望能够在获得用户反馈时对产品进行快速更改,因此灵活性非常重要.
任何反馈都会非常感激,如果我在讨论中遗漏了任何重要信息,我会很乐意提供更多信息.谢谢.
不妨以此作为答案。我应该说我对 NoSQL 并不擅长,所以我倾向于 SQL。
我会把它做成三张桌子。您将在网络上看到它被称为实体值对逻辑...它是处理项目的多个动态属性的一种方法。假设您有一堆产品,每个产品都有一些属性。
Prd 1 - a,b,c
Prd 2 - a,d,e,f
Prd 3 - a,b,d,g
Prd 4 - a,c,d,e,f
Run Code Online (Sandbox Code Playgroud)
所以这里有 4 种产品和 6 个属性...相同的理论适用于数百种产品和数千种属性。将其保存在一个表中的标准方法需要产品信息以及 6 列来存储数据(在此设置中至少有三分之一为空)。添加新属性意味着更改表以向其中添加另一列,并提供一个脚本来填充现有属性,或者将所有现有属性保留为空。不是最好玩的,可能会很头疼。
替代方法是名称值对设置。您需要一个“标题”表来保存产品之间的共同值(例如名称或价格......所有产品都具有的东西)。在上面的示例中,您会注意到每个记录都使用了属性“a”...这确实意味着属性 a 也可以是标头表的一部分。我们将此处的关键列称为“header_id”。
第二个表是一个参考表,它仅存储可分配给每个产品的属性并为其分配一个 ID。我们将使用 atrr_id 作为键来调用表属性。相当简单,上面的每个属性都是一行。
快速示例:
attr_id, attribute_name, notes
1,b, the length of time the product takes to install
2,c, spare part required
etc...
Run Code Online (Sandbox Code Playgroud)
它只是您所有属性以及该属性含义的列表。将来,您将在此表中添加一行,以便为每个标题打开一个新属性。
最终表是实际保存信息的映射表。您将获得产品 ID、属性 ID 和值。通常称为明细表:
prd1, b, 5 mins
prd1, c, needs spare jack
prd2, d, 'misc text'
prd3, b, 15 mins
Run Code Online (Sandbox Code Playgroud)
看看数据如何存储为产品密钥、值标签、值?未来添加的任何产品都可以具有此表中存储的任何属性的任意组合。添加新属性就是向属性表中添加新行,然后根据需要填充详细信息表。
我相信也有一个 wiki... http://en.wikipedia.org/wiki/Entity-attribute-value_model
之后,只需找出导出数据的最佳方法(我在这里推荐 Postgres 作为开源数据库选项)