数据驱动的计划选择限制

时间:2013-01-11 22:30:14

标签: sql join filter restriction

我正在使用一个复杂的数据结构,我不太确定如何在单个SQL查询中解决它,尽管我的直觉告诉我应该可以这样做。

我正在做的本质是尝试根据所选硬件模型显示给定供应商的可用计划结果。结果应仅遵循可能的组合,并且计划包含当前作为键/值对存储在限制表中的限制。以下是我正在使用的内容的简化:

(我将使用无线设备类比,因为几乎所有人都熟悉手机)

模型表


model_id
vendor_id
is_data
is_voice
is_4g
is_3g

示例数据:

model_id,vendor_id,is_data,is_voice,is_4g,is_3g
DeviceA,Sprint,1,1,0,1
DeviceB,Sprint,1,0,1,0
DeviceC,Sprint,0,1,0,0
DeviceD,Sprint,0,1,0,0
DeviceE,Sprint,0,1,0,0
DeviceF,Verizon,1,1,0,1
DeviceG,Verizon,1,0,1,0
DeviceH,Verizon,0,1,0,0
DeviceI,Verizon,0,1,0,0
DeviceJ,Verizon,0,1,0,0
DeviceK,Tmobile,1,1,0,1
DeviceL,Tmobile,1,0,1,0
DeviceM,Tmobile,0,1,0,0
DeviceN,Tmobile,0,1,0,0
DeviceO,Tmobile,0,1,0,0

计划表


plan_id
vendor_id
name

示例数据:

plan_id,vendor_id,name
PlanA,Sprint,Big Data Only Plan
PlanB,Verizon,Small Data Only Plan
PlanC,Sprint,300 Min Plan
PlanD,Verizon,900 Min Plan
PlanE,Verizon,Big Data Only Plan
PlanF,Tmobile,Small Data Only Plan
PlanG,Tmobile,300 Min Plan
PlanH,Tmobile,1000 Min Plan

plan_restrictions表


restriction_id
vendor_id
plan_id
type
value

示例数据:

restriction_id,vendor_id,plan_id,type,value
1,Sprint,PlanA,radio,3G
2,Sprint,PlanA,device_type,data
3,Verizon,PlanB,radio,4G
4,Sprint,PlanC,radio,3G
5,Sprint,PlanC,device_type,voice
6,Verizon,PlanD,radio,3G
7,Verizon,PlanD,device_type,voice
8,Verizon,PlanE,radio,3G
9,Verizon,PlanE,device_type,voice
10,Tmobile,PlanF,device_type,data
11,Tmobile,PlanG,device_type,voice
12,Tmobile,PlanH,device_type,voice

键入的限制(实际上我接近50,这是相同类型的表示):


type / value possibilities
radio / 3g, 4g
device_type / data, voice

我愿意重组表格以便更容易重新查询,但我需要保留一定的灵活性,因为我有大约1000个模型,1000个计划和大约2000个限制。

我个人认为这里存在某种结构问题,即。模型可能应该在单独的表中将它们的元素作为键/值对,但这更复杂,我还没有确定如何正确应用数据驱动限制。

2 个答案:

答案 0 :(得分:2)

这样的事情应该让你开始:

SELECT p.name
FROM Plans as p
INNER JOIN plan_restriction as pr
ON p.plan_id = pr.plan_id
INNER JOIN models as m
ON pr.model_id = pr.model_id
WHERE p.vendor_id = 1 AND m.is_data = 1 AND is_4g = 1 AND ...

答案 1 :(得分:0)

我和其他dba在这里玩了大约最后一小时,并认为我解决了它。我发布这个给那些发现自己处于类似情况的人。最大的问题是我太靠近数据了,并试图在计划需求和模型属性之间强制执行“有意义的”属性和限制......这不是必需的。

我可以将我的数据重组为以下表格:

  • 计划
  • 限制
  • 模型

  • 计划与限制
  • 有多对多的关系
  • 模型与限制
  • 有多对多的关系

我会解决与intirum表的多对多关系

  • Plans_Restrictions
  • Models_Restrictions

这将允许我有愚蠢的“限制”,如“红色事物”

我会查询链:

  • 计划
  • Plans_Restrictions
  • 限制
  • Models_Restrictions
  • 模型

即。要获得所有具有符合计划条件的属性信息(限制信息)的模型,我可以使用:

SELECT 
    M.* 
    ,R.*
FROM (
    SELECT P1.*
    FROM Plans P1
    WHERE id_vendor = @id_vendor
) P

INNER JOIN Plans_Restrictions PR
ON P.plan_id = PR.plan_id

INNER JOIN Restrictions R
ON PR.property = R.property

INNER JOIN Model_Restrictions MR
ON R.property = MR.property

INNER JOIN Model M
ON MR.model_id = M.model_id

为了获得所有符合模型资格的计划,我会颠倒5表链式连接。

谢谢Abe ..详细解释这一点,并解释为什么你的建议没有解决我的问题,这真的帮助我理解我的问题是什么以及我真正需要做什么。如果没有你,我认为我不会这么快解决它。