0

假设一个数据库表包含一些元素的属性:

Table Element (let's say 1 000 000 rows):
ElementId    Property_1    Property_2    Property_3
-------      ----------    ----------    ----------
1            abc            1            1
2            bcd            1            2
3            def            2            4
...

该表经常更新。我想存储这些元素集的定义,以便使用单个 SQL 语句得到例如。

SetId    Element
---      -------
A        2
B        1
B        3
C        2
C        3
...

我还想在需要时更改定义。到目前为止,我已将集合的定义存储为交集的并集,如下所示:

Table Subset (~1 000 rows):
SubsetId    Property    Value    Operator
--------    --------    -----    --------
1            1          bcd      =
1            3          1        >
2            2          3        <=
...

Table Set (~300 rows):
SetId    SubsetId
---      ------
...
E        3
E        4
F        7
F        9
...

在 SQL 中,我想我可以从表中生成很多 case 表达式,但到目前为止,我只是加载了表并使用了一个外部工具来完成基本相同的事情。

当我想出这个时,我很高兴(并且也实现了它)。最近我一直在想它是否像我想象的那样美妙。有没有更好的方法来存储集合的定义?

4

1 回答 1

1

作为替代方案,我认为在这里使用鸭式打字可能很直观。

例如,所有现代语言(C#、Java、Python)都有集合的概念。如果您要通过 SQL “相交”或“联合”(集合运算符),那么您必须以关系方式存储它们。否则,为什么不以本地语言的方式存储它们?(相对于关系)。以本地方式,我的意思是,如果它是在 Python 中完成的并且我们使用 Python 集,那么这就是我将坚持的。与 Java 或 C# 相同。

因此,如果 set-id 10 的成员为 1、4、5、6,它将按如下方式保存在数据库中:

      SetId              Set
______________________________________
10                       1,4,5,6
11                       2,3
12                       null

当然,这有一个缺点,它可能是专有的,甚至可能是非性能的——当你有完整的问题定义时,你也许可以说出来。如果你需要 SQL 来分析它,也许我的建议还有更多的缺点。

从某种意义上说,每种语言的集合表示特性就像 DSL(领域特定语言)——如果您需要在应用程序类/对象之间“谈论”很多集合内容,那么为什么不使用自然语言合身?

于 2009-11-30T21:32:24.237 回答