Sql 如何重塑数据表以允许通过动态可添加/可移动因子进行查找?
今天早上我的大脑冻结了,我希望能从社区中得到一些想法。我的数据库中有一个需要重新建模的查找表-基本示例如下:Sql 如何重塑数据表以允许通过动态可添加/可移动因子进行查找?,sql,database-design,Sql,Database Design,今天早上我的大脑冻结了,我希望能从社区中得到一些想法。我的数据库中有一个需要重新建模的查找表-基本示例如下: 因子1 因素2 因子3 价值观 这在这一点上效果很好,但业务部门现在已经决定,用于查找值的因素应该由用户更改 例如,他们可能会添加一个因子,该因子包含一个可能值列表(即另一个表),并且该因子可能会被合并到查找中,使用这种类型的表需要添加一列,即Factor4 我的第一个想法是,我们不能让用户能够在数据库中创建表、列、关系和索引,这是一个太大的完整性风险,尽管这可能是最简单的场景。让设
- 因子1
- 因素2
- 因子3
- 价值观
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
因此,我的想法是,我的值表将成为一个键/值查找,但我不确定如何对其进行建模,以便我可以基于多行而不是多列进行where…如果我正确理解了问题的要点,您想设计一些能够捕获以下概念的东西:
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
表达式Id
表示特定关系,即下标i<代码>结果值是y
<代码>因子索引仅指示哪个因子(1=因子1、2=因子2、3=因子3等)具有给定的因子值
Expression Id
上的内部联接可以将两个表组合在一起
希望这有帮助
或者一个表的方法,保留表a但删除表B。使用因子索引=0来表示y。如果我正确理解了问题的要点,你想设计一些东西来捕捉以下概念:
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
表达式Id
表示特定关系,即下标i<代码>结果值
是y
<代码>因子索引
仅指示哪个因子(1=因子1、2=因子2、3=因子3等)具有给定的因子值
Expression Id
上的内部联接可以将两个表组合在一起
希望这有帮助
或者一个表的方法,保留表a但删除表B。使用系数索引=0来表示y。我认为您想要的部分取决于您为用户构建的界面,但我认为界面直观上会受到设计的约束,因此:
列出的数据类型是假设的,当然,根据您的场景进行适当的更改
创建一个表格,列出您希望用户可以使用的所有因素,或者您希望他们能够输入自己的因素:
Factor
-------
FactorID INT
Factor VARCHAR
创建另一组表以建立因素组,以便用户可以将多个因素作为单个条目输入:
FactorGroup
-----------
FactorGroupID INT
FactorGroup VARCHAR
FactorGroupDetail
-----------------
FactorGroupDetailID INT
FactorGroupID INT
FactorID INT
现在,假设您的值是预设的,并且您不希望更改它们,那么您还需要为它们创建一个表:
Value
-----
ValueID INT
ValueName VARCHAR
Value DECIMAL
否则,我认为您可以将值
字段粘贴到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
)
我认为您需要的部分内容将取决于您为用户构建的界面,但我认为界面将直观地受到设计的约束,因此:
列出的数据类型是假设的,当然,根据您的场景进行适当的更改
创建一个表格,列出您希望用户可以使用的所有因素,或者您希望他们能够输入自己的因素:
Factor
-------
FactorID INT
Factor VARCHAR
创建另一组表以建立因素组,以便用户可以将多个因素作为单个条目输入:
FactorGroup
-----------
FactorGroupID INT
FactorGroup VARCHAR
FactorGroupDetail
-----------------
FactorGroupDetailID INT
FactorGroupID INT
FactorID INT
现在,假设您的值是预设的,并且您不希望更改它们,那么您还需要为它们创建一个表:
Value
-----
ValueID INT
ValueName VARCHAR
Value DECIMAL
否则,我认为您可以将值
字段粘贴到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
)
这是我一直在想的,但现在我陷入了:如何根据多个因子细节值查找因子组id