2013-01-11 10 views
1

我有一个复杂的数据结构,我正在使用,我不太清楚如何在单个SQL查询中解决它,但我的直觉告诉我应该可以这样做。计划选择的数据驱动限制

我正在做的事情的本质是试图根据选定的硬件模型显示给定供应商的可用计划的结果。结果应该仅遵循可能的组合,并且计划包含当前作为键/值对存储在限制表中的限制。下面就是我一起工作的简化:

(我将使用无线设备的比喻,因为几乎每个人都在用手机familair)

车型表


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个限制。

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

+0

我很难想象你在说什么。是否有可能获得一些样本数据和期望的输出? –

+0

只是一个简单的说明,我曾想过在计划和模型之间放置多对多的表格,并以这种方式处理它,我尝试这种方式的唯一原因是因为大多数情况下,公平地说:几乎所有的设备每个供应商的支持几乎可以拥有供应商提供的几乎所有计划,并且具有最小限制。我会为你上传一些模拟数据。 – Dave

+0

Dave,阅读你关于限制的硬编码的评论,我想更好地理解这个问题。一旦选择了供应商,我们就剩下一些我们需要通过限制进行过滤的计划和模型。您的模型的主要问题在于,您在模型表格上存储Data/Voice/Raido类型的方式与限制中的存储方式不同。这意味着在你做简单的INNER JOIN之前,你需要做一个Restrictions表的简单转换。无论如何,这将需要一些硬编码。 – Bulat

回答

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台链式连接。

谢谢安倍写下这一切详细解释它,并理解为什么你的建议没有解决我的问题真的帮助我了解我的问题是什么以及我真的需要做什么。没有你,我不认为我会如此快速地解决它。

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 ... 
+0

我的困境的关键是我不想将限制硬编码到我的SQL查询中。 – Dave