有一个非常相似的问题:Modeling products with vastly different sets of needed-to-know information and linking them to lineitems?但我找不到能帮助我的答案;
上述Q& A中的某个人指向designing database to hold different metadata information,其答案非常出色,但由于我的程序中明确需要搜索功能,因此我不希望性能受到影响。
我是“技术人员”,使用PHP + Oracle来跟踪公司的销售进度并生成报告。我们的工作流程通常如下所示:
问题:
许多数据集列是相同的(或可以认为是相同的),如下所示:
account|customer_name|gender|location|program_segment|...
但营销部门。比如提出新的想法(并放弃现有的想法),所以每个“销售计划(活动)”都可能有自己的数据,例如
对于程序1,它们可能包含:
...|prev_coupon_code|last_usage_amount|...
但是对于程序2,它们可能包含:
...|is_in_plan_1|is_in_plan_2|...
你明白了。
尝试失败:
为了保存所有数据,我曾经使用一个“足够长”的表,其中包含所有可能的属性(列),并留下空白/不必要的属性NULL
。
但现在我觉得它永远不会“足够长”,因为有太多“属性”甚至更多“销售重点”:我为系统的新版本起草了一个41列表并且突然他们提出了一个新程序,其中包含的信息无法适用。
有人建议我在表格中创建“虚拟列”并在前端“记住”它们的不同含义。这可以适用于多种数据类型,例如NUMBER(1)
用于Y / N,DATE
等,但在谈到VARCHAR2
时,我不确定其中有多少是足够的...... .plus这使得桌子看起来“脏”。
问题:
感到沮丧,我现在正在认真考虑为不同的程序使用不同的表格,并使用UNION
条款生成大报告,以防他们被问到“我们这个月/季节/年的销售情况如何?” / p>
从技术上讲,这是一个好习惯吗?我应该实施吗?
修改#1:
为了澄清,一个“销售计划”通常会在放弃之前运行几个月,并且每个运行程序每月至少会有一个数据集。
并且可以同时运行多个程序。
修改#2:
那些“程序指定的”列有不同的编号:一个程序可能需要10个,而另一个程序可能只需要1个。
答案 0 :(得分:2)
这是没有正确答案的情况之一,只是选择了kludges。
我会喜欢使用XMLType来保存瞬态数据结构。 XML使我们能够为每个计划定义模式,但使用XMLType不需要更改数据库本身。我们可以索引XPath查询,因此性能仍然可以很好。 Find out more
一个问题是,针对XML编写查询有点儿,但我认为对于你所采用的任何一个apporach来说,尴尬的查询都是一个问题。
答案 1 :(得分:1)
您可能知道也可能不知道可以索引Oracle中字符LOB的内容。您可以查找Oracle Intermedia / multimedia(取决于您的版本)并与您的DBA交谈,看看它是否可供您使用。
这样就可以为常见数据项创建一个通用结构 - 例如campaign,start_date,end_date,&c;然后将您的电子表格/ xml数据/ csv文件转储到CLOB字段中。
纯文本索引并不像第一次听起来那么难,而且非常可爱。
答案 2 :(得分:0)
如果你沿着不同的表路径走下去,你将永远改变代码以满足不断变化的列等。
一个选项是增加2个“campaign_name”,“campaign_value”列,并将他们发送的列名放在NAME列中,将值放在值列中。
所以,
account|customer_name|.....|campaign_name|campaign_value
'ACC001'|'Frank Burns'|........|'prev_coupon_code'|[value of prev_coupon_code
然后在你的第二个例子中:
account|customer_name|.....|campaign_name|campaign_value
'ACC001'|'Frank Burns'|........|'is_in_plan_1'|[value of is_in_plan_1
更新 - 是的,这将涉及更改表格的粒度,以便为每个广告系列添加一组数据。 导入会有一点不同,因为你会为那里出现的每个列名称加入UNION,并且报告需要考虑谷物变化。
这听起来像是完全浪费空间,但如果这些是Excel表格,那么性能应该无关紧要。如果确实如此,则需要将表拆分为 - 广告系列,帐户,accounts_campaigns
答案 3 :(得分:0)
在我目前的工作中,我成功使用了以下系统2年。
你有一个主表,比方说'报告',它包含所有类型报告的公共列。
id - primary,auto_increment。
name - 报告的名称。
然后,对于每个特定报告,您有另一个表,称为“report_marketing”。你有report_id列,这是第一个主表的外键。在这里,您可以为此特定报告添加所有特定列。
要获得结果,只需使用LEFT JOIN。
如果某些报告共享来自2个或更多表的某些列,则您始终可以加入多个列。
以下是您可能拥有的查询示例:
SELECT report.name, report_marketing.ammount FROM report WHERE report.type = 'M'
LEFT JOIN report_marketing ON report_marketing.report_id = report.id;