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

Sql 如何重塑数据表以允许通过动态可添加/可移动因子进行查找?,sql,database-design,Sql,Database Design,今天早上我的大脑冻结了,我希望能从社区中得到一些想法。我的数据库中有一个需要重新建模的查找表-基本示例如下: 因子1 因素2 因子3 价值观 这在这一点上效果很好,但业务部门现在已经决定,用于查找值的因素应该由用户更改 例如,他们可能会添加一个因子,该因子包含一个可能值列表(即另一个表),并且该因子可能会被合并到查找中,使用这种类型的表需要添加一列,即Factor4 我的第一个想法是,我们不能让用户能够在数据库中创建表、列、关系和索引,这是一个太大的完整性风险,尽管这可能是最简单的场景。让设

今天早上我的大脑冻结了,我希望能从社区中得到一些想法。我的数据库中有一个需要重新建模的查找表-基本示例如下:

  • 因子1
  • 因素2
  • 因子3
  • 价值观
这在这一点上效果很好,但业务部门现在已经决定,用于查找值的因素应该由用户更改

例如,他们可能会添加一个因子,该因子包含一个可能值列表(即另一个表),并且该因子可能会被合并到查找中,使用这种类型的表需要添加一列,即Factor4

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

第二个想法是重新建模,以便将因子指定为表中的值,但今天上午,我对我需要采取的方法画了一个空白,以便可以完成查找。首先,当我必须查找哪些因素决定哪些值时,如何完成查找。。。看起来我必须动态地创建一个查询,但这似乎也不是正确的方法

有什么想法吗

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

我需要得到值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

因此,我的想法是,我的值表将成为一个键/值查找,但我不确定如何对其进行建模,以便我可以基于多行而不是多列进行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