SQL Server体系结构

SQL Server体系结构,sql,sql-server,database-design,Sql,Sql Server,Database Design,这是一个很难解释的问题。我将尝试将我们的问题关联到一个通用规范中 我有一个问题表,需要根据特定情况提出。例如,假设我有两个苹果1个苹果是蓝色的,而另一个苹果是红色的 现在,如果我们有一个红苹果,我需要分配一个问题。但是,我还需要能够为1个红苹果和1个蓝苹果的组合指定一个问题 构建这个的最佳方式是什么?我觉得我已经接近了,但我仍在努力完成它 FilterGroupID是它们需要分组的位置。因此,在下面,当我们被给予蓝色和小型时,需要查询问题ID 3 场景 我得到了一个苹果的某种组合。它是蓝色的,

这是一个很难解释的问题。我将尝试将我们的问题关联到一个通用规范中

我有一个问题表,需要根据特定情况提出。例如,假设我有两个苹果1个苹果是蓝色的,而另一个苹果是红色的

现在,如果我们有一个红苹果,我需要分配一个问题。但是,我还需要能够为1个红苹果和1个蓝苹果的组合指定一个问题

构建这个的最佳方式是什么?我觉得我已经接近了,但我仍在努力完成它

FilterGroupID是它们需要分组的位置。因此,在下面,当我们被给予蓝色和小型时,需要查询问题ID 3

场景 我得到了一个苹果的某种组合。它是蓝色的,很小。我需要能够查询这些与这个苹果相关的问题。所以,我需要任何过滤器类型/值匹配的问题。所以在这个场景中,我想问以下问题:

  • 蓝苹果问题

  • 小苹果问题

  • 蓝色和小苹果问题

  • 如果你看下图,我得到了一个蓝色的大苹果。我唯一关心的问题(存储在表中)是“蓝苹果问题”。现在,如果给我一个蓝苹果和小苹果,我会关心“蓝苹果问题”和“蓝苹果和小苹果问题”。只有当苹果是蓝色和小的,才会显示问题“蓝色和小苹果问题”。也就是说,没有显示苹果是蓝色的还是大的


    这是模型的简化版本,使用了稍微不同的术语,因此我可以理解我所说的:-):

    为了提高示例的可读性,我将最后一个表及其记录重写为:

    Table: Questions (Question, QualityOption)
    Records: (Q1, Red), (Q1, Small), (Q2, Red), (Q3, Big), (Q4, Small), (Q5, Blue), 
             (Q5, Big), (Q6, Small)
    
    Table: Items (Item)
    Records: (a small blue item), (a blue item), (a red item), (a big blue item)
    
    Table: ItemQualities (Item, QualityOption) - again, simplified!
    Records: (a small blue item, small), (a small blue item, blue), (a blue item, blue),
             (a red item, red), (a big blue item, big), (a big blue item, blue)
    
    假设
    Item=“一个蓝色的小项目”
    。查询
    ItemQualities
    关系以获取质量
    small
    blue
    。查询
    问题
    关系以获取候选人:
    (Q1,小)
    (Q4,小)
    (Q5,蓝色)
    (Q6,小)
    。但是您还没有完成:再次查询
    问题
    ,查看候选问题
    Q1
    Q4
    Q5
    Q6
    ,是否还有其他记录。对于
    Q1
    还有
    (Q1,红色)
    ,这意味着我们必须放弃
    Q1
    。对于
    Q5
    还有
    (Q5,大)
    ->丢弃。所以我们有了我们的结果集:
    {Q4,Q6}

    现在假设
    Item=“一个蓝色的大项目”
    ,那么
    ItemQualities
    表返回
    big
    blue
    。来自
    问题
    的候选人是
    (Q3,大),(Q5,蓝色),(Q5,大)
    。再次查询
    问题
    以获取与候选人
    Q3、Q5
    相关的所有其他记录。没有返回其他记录,因此我们可以返回
    {Q3,Q5}

    create table Items (Item varchar(100))
    create table ItemQualities (Item varchar(100), QualityOption varchar(20))
    create table Questions (Question varchar(20), QualityOption varchar(20))
    
    insert Items select 'a small blue item' union all select 'a big blue item'
    insert ItemQualities select 'a small blue item', 'small' union all select 'a small blue item', 'blue'
    union all select 'a big blue item', 'big' union all select 'a big blue item', 'blue'
    
    insert Questions select 'Q1', 'red' union all select 'Q1','small' 
    union all select 'Q2', 'red' union all select 'Q3', 'big' union all select 'Q4', 'small'
    union all select 'Q5', 'Blue' union all select 'Q5', 'big' union all select 'Q6', 'small'
    
    select * from items
    select * from itemqualities
    select * from questions
    
    declare @item varchar(100) = 'a small blue item';
    
    
    ; with x as (
    select count(*) cnt, q.Question
    from ItemQualities iq join Questions q on iq.QualityOption = q.QualityOption
    where item = @item
    group by q.Question
    )
    ,
    y as 
    (
    select count(*) cnt, x.Question 
        from x
    join Questions q on x.Question = q.Question
        group by x.Question
    )
    select distinct x.Question from x join y on x.Question = y.Question and x.cnt = y.cnt
    

    这是模型的简化版本,使用了稍微不同的术语,因此我可以理解我所说的:-):

    为了提高示例的可读性,我将最后一个表及其记录重写为:

    Table: Questions (Question, QualityOption)
    Records: (Q1, Red), (Q1, Small), (Q2, Red), (Q3, Big), (Q4, Small), (Q5, Blue), 
             (Q5, Big), (Q6, Small)
    
    Table: Items (Item)
    Records: (a small blue item), (a blue item), (a red item), (a big blue item)
    
    Table: ItemQualities (Item, QualityOption) - again, simplified!
    Records: (a small blue item, small), (a small blue item, blue), (a blue item, blue),
             (a red item, red), (a big blue item, big), (a big blue item, blue)
    
    假设
    Item=“一个蓝色的小项目”
    。查询
    ItemQualities
    关系以获取质量
    small
    blue
    。查询
    问题
    关系以获取候选人:
    (Q1,小)
    (Q4,小)
    (Q5,蓝色)
    (Q6,小)
    。但是您还没有完成:再次查询
    问题
    ,查看候选问题
    Q1
    Q4
    Q5
    Q6
    ,是否还有其他记录。对于
    Q1
    还有
    (Q1,红色)
    ,这意味着我们必须放弃
    Q1
    。对于
    Q5
    还有
    (Q5,大)
    ->丢弃。所以我们有了我们的结果集:
    {Q4,Q6}

    现在假设
    Item=“一个蓝色的大项目”
    ,那么
    ItemQualities
    表返回
    big
    blue
    。来自
    问题
    的候选人是
    (Q3,大),(Q5,蓝色),(Q5,大)
    。再次查询
    问题
    以获取与候选人
    Q3、Q5
    相关的所有其他记录。没有返回其他记录,因此我们可以返回
    {Q3,Q5}

    create table Items (Item varchar(100))
    create table ItemQualities (Item varchar(100), QualityOption varchar(20))
    create table Questions (Question varchar(20), QualityOption varchar(20))
    
    insert Items select 'a small blue item' union all select 'a big blue item'
    insert ItemQualities select 'a small blue item', 'small' union all select 'a small blue item', 'blue'
    union all select 'a big blue item', 'big' union all select 'a big blue item', 'blue'
    
    insert Questions select 'Q1', 'red' union all select 'Q1','small' 
    union all select 'Q2', 'red' union all select 'Q3', 'big' union all select 'Q4', 'small'
    union all select 'Q5', 'Blue' union all select 'Q5', 'big' union all select 'Q6', 'small'
    
    select * from items
    select * from itemqualities
    select * from questions
    
    declare @item varchar(100) = 'a small blue item';
    
    
    ; with x as (
    select count(*) cnt, q.Question
    from ItemQualities iq join Questions q on iq.QualityOption = q.QualityOption
    where item = @item
    group by q.Question
    )
    ,
    y as 
    (
    select count(*) cnt, x.Question 
        from x
    join Questions q on x.Question = q.Question
        group by x.Question
    )
    select distinct x.Question from x join y on x.Question = y.Question and x.cnt = y.cnt
    

    似乎您试图建模的是问题和给定值之间的多对多关系。但是从发布的详细信息来看,很难理解这些表之间的关系。@SeanLange我只是添加了一个场景来尝试帮助您。@SeanLange我也只是添加了一点更多的细节来尝试帮助您。请阅读并接受答案。您试图建模的似乎是问题之间的多对多关系和给定值。但是从发布的详细信息来看,很难理解这些表之间的关系。@SeanLange我只是添加了一个场景来尝试帮助您。@SeanLange我也只是添加了一点详细信息来尝试帮助您。请阅读并接受答案。我正在努力理解您所说的“再次查询”是什么意思你的意思是加入吗?我没有谈细节,我主要对模型感兴趣。我演示了如何使用它来获得结果,而不是给出实际的SQL语句——我认为这些或多或少都会发生。明天我会给你们一个更完整的例子,现在是希腊的凌晨3点!明白了。我用实际的sql语句等创建了一个更好的例子来说明我在一个新问题中所处的位置。我完成了这个例子(尽管需要睡觉)。这是一个演示。您指定变量@item(Items
    表中的一个值),相关问题将被重新处理