回答

收藏

添加了多个过滤器后将向用户显示的数据的SQL vs NoSQL

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-14

我将要从事一个超出我正常职责范围的工作项目。作为一个SQL
! d7 k; |+ y2 T% K1 UDBA,我最初的意图是使用SQL数据库来处理该项目,但是我对NoSQL的了解越多,我就越相信它可能是更好的选择。我希望我可以用这个问题来高层次地描述该项目,以获得有关使用每个选项的利弊的一些反馈。$ W0 K- {: n5 x7 N$ v5 p
该项目相对简单。我有一组具有各种属性的对象。这些属性中的某些属性是所有对象共有的,而某些属性仅是对象的子集所共有的。我负责构建的是一项服务,其中用户根据对象的属性选择一系列过滤器,然后返回与所有过滤器匹配的对象列表。当用户选择过滤器时,他或她可能正在对common或subset属性进行过滤,但该过滤器是在前端进行抽象的。6 j" ?; J% O; i. H' F
^根据用户反馈,有可能对象列表可能仅与某些过滤器匹配,并且匹配质量将通过指示匹配多少个标准的分数显示给用户。( k3 n# D/ Q+ f% e3 }4 R
看完MartinFolwler的演讲后,文档样式的NoSQL数据库似乎可以满足我的需求,但是鉴于我对这种方法没有经验,我也有可能遗漏了一些明显的东西。
0 R, G# b, P& s8 J一些其他信息-  b1 h" c' W+ U$ g  K) d% Z6 L8 f
数据库最初将有大约5,000个对象,每个对象包含10到50个属性,但是对象的数量肯定会随着时间的推移而增长,并且属性的数量可能会根据用户反馈而增长。另外,我希望能够在收到用户反馈时对产品进行快速更改,因此灵活性非常重要。
0 V( z: M8 N: l5 l- u任何反馈将不胜感激,如果我在讨论中遗漏了任何重要信息,我将很乐意提供更多信息。谢谢。! C0 v: }) V* i5 G- |
               
8 b, z! @6 {& N1 P; r8 d解决方案:: ~& x! B$ t8 W. B
               
1 m; S) x& I, B$ t# F2 S) F& I$ C! A8 l/ V; V1 E2 K8 }
2 X* R3 n* l9 y2 b9 d' h# ]/ e
                也可以将此作为答案。我应该评论说,我在NoSQL方面不强,所以我倾向于使用SQL。
, ^# F( {1 J7 ~我会以三张桌子的形式来做这件事。您会在网络上看到它被称为实体值对逻辑的一种……这是一种处理项目的多个动态属性的方法。假设您有一堆产品,每个产品都有一些属性。
2 J6 e; x+ F- i$ l( q$ |& ?, xPrd 1 - a,b,c
' g5 ^3 E+ f. m! n  }+ BPrd 2 - a,d,e,f% ?- N0 E7 |2 I9 n/ z- L0 B0 Z9 L
Prd 3 - a,b,d,g
3 D  d$ M. ?; ~" s6 c' zPrd 4 - a,c,d,e,f
9 V" m, F1 A8 K! D7 I. b因此,这里有4个产品和6个属性…相同的理论适用于数百个产品和数千个属性。将其保存在一个表中的标准方法需要产品信息以及6列来存储数据(在此设置中,至少有三分之一为空)。添加新属性意味着更改表以在表中添加另一列,并提出一个脚本来填充现有表或仅将其保留为所有现有表为空。不是最有趣的,可能是头痛。3 ^0 \) K! H! H% C: S* @
替代方法是设置名称/值对。您想要一个“表头”表来保存产品之间的通用值(例如名称或价格…所有产品都具有的东西)。在上面的示例中,您会注意到在每个记录上都使用了属性“; c5 [# m7 C3 w5 G* O
a”……这确实意味着属性a也可以是标头表的一部分。我们将此处的关键列称为“ header_id”。
% B8 r9 n4 x" n8 `! a/ b( V! K9 G第二张表是一个参考表,它仅用于存储可以分配给每个产品的属性并为其分配ID。我们将使用atrr_id作为关键字调用table属性。直截了当,上面的每个属性都是一行。
9 a  F+ ]4 C+ K- K7 [快速示例:1 J4 z5 r9 ]1 D, R: O5 ^: Q
attr_id, attribute_name, notes# I  A$ Y1 O' e' J3 L: Z
1,b, the length of time the product takes to install' r; Y" @0 E- ^6 B4 X& e
2,c, spare part required* W, Q6 n/ U3 @5 Q0 e
etc...
% [+ X) k3 R% H: o& J# U: X它只是所有属性及其含义的列表。将来,您将在此表中添加一行以为每个标题打开一个新属性。
& h+ c9 p, j+ X9 Y- `: g0 k' I$ _最终表是实际上包含信息的映射表。您将拥有您的产品ID,属性ID,然后是值。通常称为明细表:
' q5 t/ `" z' W: C* e8 qprd1, b, 5 mins
2 W: ]' ^+ `: u  ?. fprd1, c, needs spare jack6 R+ G! o& o: ~# C6 F% t4 I
prd2, d, 'misc text'
- ^0 ~1 l( x3 l# g/ i0 z: Pprd3, b, 15 mins( x) i8 C# q: L) }, [) B5 |2 Y
看看数据如何存储为产品密钥,价值标签,价值?将来添加的任何产品都可以具有此表中存储的任何属性的任意组合。添加新属性是在属性表中添加新行,然后根据需要填充详细信息表。
- T! b, w6 j  Q2 n  c我相信这里也有一个wiki … http://en.wikipedia.org/wiki/Entity-attribute-
- I; v/ U. l6 }7 S: j- Z9 X/ [- gvalue_model7 q/ Q/ [& `; r+ d
在此之后,它只是想出最好的方法来处理您的数据(我建议在这里将Postgres作为开源db选项)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则