【发布时间】:2012-12-26 14:23:46
【问题描述】:
我正在使用一个复杂的数据结构,我不太确定如何在单个 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 个限制。
我个人认为这里存在某种结构问题,即。模型可能应该将它们的元素作为键/值对放在单独的表中,但这更加复杂,而且我还没有确定如何首先正确应用数据驱动的限制。
【问题讨论】:
-
我很难想象你在说什么。是否有可能获得一些样本数据和所需的输出?
-
只是一个简短的说明,我考虑过在计划和模型之间放置一个多对多表并以这种方式处理它,我尝试这条路径的唯一原因是因为在大多数情况下它是公平的说:几乎每个供应商支持的所有设备都可以拥有供应商提供的几乎所有计划,并且限制最小。我会上传一些模拟数据给你阿部。
-
戴夫,阅读您关于限制的硬编码的评论,我想更好地理解这个问题。一旦选择了供应商,我们就会留下一些需要按限制过滤的计划和模型。您的模型的主要问题是您在模型表上存储数据/语音/Raido 类型的方式与它在限制中的存储方式不同。这意味着在进行简单的 INNER JOIN 之前,您需要对 Restrictions 表进行简单的转换。无论如何,这将需要一些硬编码。
标签: sql join filter restriction