对不同(但相似)的商业计划使用不同的表是一种好的做法吗?

时间:2013-02-28 09:04:26

标签: php database oracle database-design

有一个非常相似的问题: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来跟踪公司的销售进度并生成报告。我们的工作流程通常如下所示:

  1. 营销人员为我的系统提供准备好的数据集;
  2. 前线员工(销售)标志着我的系统进度;
    • 任何人都可以在系统中搜索结果;
  3. 我向营销人员报告。
  4. 问题

    许多数据集列是相同的(或可以认为是相同的),如下所示:

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

4 个答案:

答案 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;