如何重新构建数据表以允许通过动态可添加/可移除因子进行查找?

时间:2011-05-17 16:10:16

标签: sql database-design

我今天早上大脑冻结,希望能从社区反弹一些想法。我的数据库中有一个我需要重新构建的查找表 - 其基本示例是:

  • 因子1
  • 因子2
  • Factor3

这一点在这一点上运作良好,但业务现在已经决定用户可以改变查找价值的因素。

例如,他们可能会添加一个具有可能值列表的因子(即另一个表),并且可以将其合并到查找中,使用此样式的表将需要添加一列,即因子4。

我的第一个想法是,我们不能让用户能够在数据库中创建表,列,关系和索引,这只是一个完整性风险,尽管这可能是最直接的场景。让设置新因子列的代码自动创建值表,生成关系,设置索引,修改查找存储过程等等。但这一切似乎都不是好习惯。

第二个想法是改造,以便将因子指定为表格中的值,但是今天早上,我正在绘制一个空白,我需要采取的方法,以便完成查找。首先,当我必须查找哪些因素构成决定哪个值时,如何完成查找...似乎我将不得不动态创建查询,但这似乎也不会喜欢正确的方式。

有什么想法吗?

假设我的(原始)表中有以下内容:

FactorValues
============
Factor1 | Factor2 | Factor3 | Value
-----------------------------------
 1         1         1         0.5
 1         1         2         1.0
 1         1         3         1.5
 1         2         1         2.0
 1         2         2         2.5
 1         2         3         3.0

我需要获得3.0的价值(基于已知因素),这是一个很好的

Select Value 
From   FactorValues 
Where  Factor1 = 1 
And    Factor2 = 2 
And    Factor3 = 3

所以现在,让我说我已经重新设计了最终用户可以在查找中添加一个因子,我仍然需要能够根据以下语义提取值:

Select Value
From   FactorValues
Where  FirstUserDefinedFactor = FirstSelectedValue
And    SecondUserDefinedFactor = SecondSelectedValue
And    NthUserDefinedFactor = NthSelectedValue

所以我的想法就是我的Value表只会成为一个键/值查找,但我不知道如何建模它以便我可以根据多行而不是多列来做... / p>

2 个答案:

答案 0 :(得分:1)

我认为你想要的一些东西将取决于你为用户建立的界面,但我认为界面会直观地受到设计的限制,所以这里有:

列出的

数据类型当然是假设的,根据您的方案进行适当的更改

创建一个表格,其中包含您希望用户可以使用的所有因素,或者您希望他们能够自行输入的所有因素:

Factor
-------
FactorID INT
Factor VARCHAR

创建另一组将建立因子组的表,以便您的用户可以输入多个作为单个条目:

FactorGroup
-----------
FactorGroupID INT
FactorGroup VARCHAR

FactorGroupDetail
-----------------
FactorGroupDetailID INT
FactorGroupID INT
FactorID INT

现在,假设您的值已预设,并且您不希望它们更改,您还需要一个表格:

Value
-----
ValueID INT
ValueName VARCHAR
Value DECIMAL

否则,我认为你可以将Value字段放在FactorGroup表中。

最后,一个表格将因子组与值匹配:

FactorValue
-----------
FactorGroupID INT
ValueID INT

我认为您需要的查询可能类似于:

SELECT v.Value
FROM Value AS v
INNER JOIN FactorValue AS fv
    ON v.ValueID = fv.ValueID
INNER JOIN FactorGroup AS fg
    ON fv.FactorGroupID = fg.FactorGroupID
INNER JOIN FactorGroupDetail AS fgd
    ON fg.FactorGroupID = fgd.FactorGroupID
INNER JOIN Factor AS f
    ON fgd.FactorID = f.FactorID
WHERE f.FactorID IN (
    SELECT FactorID
    FROM Factor AS ftor
    WHERE ftor.Factor = @user_entered_factor1
        OR ftor.Factor = @user_entered_factor2
        OR ftor.Factor = @user_entered_factor3
)

答案 1 :(得分:0)

如果我对问题的要点是正确的,那么你想要设计一些能够捕捉到以下概念的东西:

f(X[i]) = y[i]

f是某种函数,X是一些n元组因子,y是结果值。 ([i]表示下标i。)

假设f不会改变,那么或许至少可以使用两个表的方法。

Table A, Columns: Expression-Id, Factor-Index, Factor-Value

Table B, Columns: Expression-Id, Result-Value

Expression-Id表示特定关系,即下标i。 Result-ValueyFactor-Index只是表明哪个因素(1 =因子1,2 =因子2,3 =因子3等)具有给定的Factor-Value

Inner Join上的Expression-Id可以将两张桌子编织在一起。

希望这有帮助!


或者采用一种表方法,保留表A但丢弃表B.使用Factor-Index = 0来表示y。