如何在 RDBMS 中存储和搜索序列?
我需要在数据库(SQL Server 2008)中存储一些序列/列表,然后从数据库中查找特定序列的 ID(如果存在)。
例如,我有两个序列:
序列 1:A、B、C 序列2:A、C、M、N
目前它们存储在下表中。 (如果可以让事情变得更容易,我可以更改表。)
seq_id token order
1 A 0
1 B 1
1 C 2
2 A 0
2 C 1
2 M 2
2 N 3
我想编写一个查询来返回给定序列的 id,例如“A,B,C”(如果存在精确匹配)。序列的长度事先是未知的。谢谢你!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您需要的是所谓的关系划分(请参阅Celko)。最佳解决方案取决于您的 RDB 引擎。如果您能够这样做 - 最流行的解决方案是:
假设您有一个 #query 表,其中包含您希望查找的标记和排序(我使用 sort 而不是 order 来避免与保留关键字冲突)
将返回与您的查询匹配的 seq_id。在较新版本的 MsSql 中,人们将使用表变量而不是 #query,但该技术可以普遍应用。
What you need is called relational division (see Celko). The best solution will depend on your rdb engine. If you are able to do so - the most popular solution would be:
Let's say you have a #query table holding tokens and sorts you wish to find (I use sort instead of order to avoid conflicts with reserved keywords)
Will return seq_id(s) that match your query. In newer versions of MsSql one would use a table variable instead of #query but the technique can be applied universally.
您需要的是每个序列的特定于订单的签名。使用 SQL Server 2008,您可以使用 For Xml Path 构造为每个序列和条件组合签名,然后将其与另一个进行比较。显然,这不会很快。您可以在保存每个序列或更改其成员资格时将签名存储到每个序列的相应表中,从而极大地提高速度(也可以使用触发器)。另外,我这里只是使用了原始签名。但是,通常情况下,我倾向于使用 Hashbytes 函数对签名使用组装值的哈希值。
What you need is an order-specific signature for each sequence. Using SQL Server 2008, you can use the For Xml Path construct to assemble a signature for each sequence and the criteria and then compare one to the other. Obviously, this will not be fast. You can improve the speed tremendously by storing the signature into the appropriate table for each sequence at the time they are saved or their membership is changed (could also use a trigger). In addition, I simply used the raw signature here. However, normally, I'd be inclined to use a hash of the assembled value for the signature using the Hashbytes function.
为什么不按原样存储:
查询变得微不足道
Why not to store it as is:
Query becomes trivial