我今天早上大脑冻结,希望能从社区反弹一些想法。我的数据库中有一个我需要重新构建的查找表 - 其基本示例是:
这一点在这一点上运作良好,但业务现在已经决定用户可以改变查找价值的因素。
例如,他们可能会添加一个具有可能值列表的因子(即另一个表),并且可以将其合并到查找中,使用此样式的表将需要添加一列,即因子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>
答案 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-Value
是y
。 Factor-Index
只是表明哪个因素(1 =因子1,2 =因子2,3 =因子3等)具有给定的Factor-Value
。
Inner Join
上的Expression-Id
可以将两张桌子编织在一起。
希望这有帮助!
或者采用一种表方法,保留表A但丢弃表B.使用Factor-Index
= 0来表示y。