5

有一个非常相似的问题:用截然不同的需要知道的信息集对产品进行建模并将它们链接到产品线?但我找不到对我有帮助的答案;

上述问答中有人指出设计数据库来保存不同的元数据信息,这有一个很好接受的答案,但由于我的程序明确需要搜索功能,我不希望性能受到影响。


我是一名“技术员”,使用 PHP + Oracle 来跟踪我们公司的销售进度并生成报告。我们的工作流程通常如下所示:

  1. 营销人员为我的系统提供准备好的数据集;
  2. 一线员工(销售)在我的系统上标记进度;
    • 任何人都可以在系统中搜索结果;
  3. 我生成报告给营销人员。

问题

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

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/NDATE等,但是在谈论 时VARCHAR2,我不确定其中有多少就足够了……而且这会使表格看起来“脏”。

问题:

沮丧,我现在正在认真考虑为不同的程序使用不同的表格,并使用UNION子句生成大报告,以防他们被问到“我们这个月/季节/年的销售情况如何?”

从技术上讲,这是一个好习惯吗?我应该实施吗?


编辑#1:

澄清一下,一个“销售程序”通常会运行几个月后被放弃,每个运行程序每月至少有一个数据集。

并且可以同时运行多个程序。

编辑#2:

那些“程序指定”的列有不同的数量:一个程序可能需要 10 个,而另一个可能只需要 1 个。

4

4 回答 4

2

这是没有正确答案的情况之一,只是一种选择。

我会很高兴使用 XMLType 来保存瞬态数据结构。XML 使我们能够为每个计划定义模式,但使用 XMLType 避免了更改数据库本身的需要。我们可以索引 XPath 查询,因此性能仍然很好。 了解更多

一个问题是针对 XML 编写查询有点麻烦,但我认为无论您采用哪种方法,笨拙的查询都将是一个问题。

于 2013-02-28T10:07:00.753 回答
1

您可能知道也可能不知道可以在 Oracle 中对字符 LOB的内容进行索引。您可能会查找 Oracle Intermedia / 多媒体(取决于您的版本)并与您的 DBA 交谈以查看您是否可以使用它。

这样就可以为公共数据项创建一个公共结构——例如活动、开始日期、结束日期等,然后将电子表格/xml 数据/csv 文件转储到 CLOB 字段中。

纯文本索引并不像最初听起来那么难,而且确实非常可爱。

于 2013-02-28T09:45:36.920 回答
0

如果您沿着不同的表格路径走下去,您将永远更改代码以满足不断变化的列等。

一种选择是添加 2 个附加列“campaign_name”、“campaign_value”,并将他们发送给您的列名放在 NAME 列中,将值放在 value 列中。

所以,

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

更新 - 是的,这将涉及更改表格的粒度,以便您为每个广告系列添加一组数据。导入会有所不同,因为您将在那里出现的每个列名的记录联合起来,并且报告需要考虑到粒度变化。

这听起来完全是浪费空间,但如果这些是 Excel 表格,那么性能应该无关紧要。如果是这样,您需要将表格拆分为 - 广告系列、帐户、accounts_campaigns

于 2013-02-28T09:15:25.477 回答
0

在我目前的工作中,我成功使用了以下系统 2 年。

你有一个主表,比如说“报告”,它由所有类型的报告的公共列组成。

id - 主要的,自动增量。

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;
于 2013-02-28T12:49:57.960 回答