代码之家  ›  专栏  ›  技术社区  ›  user366312

需要数据库设计建议

  •  0
  • user366312  · 技术社区  · 15 年前

    我需要设计一个医药产品的日常销售表。

    有数百种产品可供选择名称、代码。

    雇佣数千名销售人员销售这些产品名称、代码。

    他们从不同的仓库收集产品名称,代码。

    它们在不同的区域工作——区域——市场——门店等——都有名称和代码

    每种产品都有不同的价格类型生产价格、贸易价格、商业价格、折扣价格等。同时,销售人员可以自由选择这些组合来估计销售价格。

    问题是,日常销售需要大量的数据输入。在几年内,可能会有千兆字节的数据(如果不是千兆字节的话)。如果我需要显示每日、每周、每月、每季度和每年的销售报告,我将需要各种类型的SQL查询。

    这是我的初步设计:

    Product {ID, Code, Name, IsActive}
    ProductXYZPriceHistory {ID, ProductID, Date, EffectDate, Price, IsCurrent}
    SalesPerson {ID, Code, Name, JoinDate, and so on..., IsActive}
    SalesPersonSalesAraeaHistory {ID, SalesPersonID, SalesAreaID, IsCurrent}
    Depot {ID, Code, Name, IsActive}
    Outlet {ID, Code, Name, AreaID, IsActive}
    AreaHierarchy {ID, Code, Name, PrentID, AreaLevel, IsActive}
    DailySales {ID, ProductID, SalesPersonID, OutletID, Date, PriceID, SalesPrice, Discount, etc...}
    

    现在,除了索引之外,我如何规范化 DailySales 表有一个细粒度的设计,我不需要改变多年来?

    请给我看一个 只有 这个 每日销售 基于上述信息的数据输入表(从中查询所有类型的报告)。

    我不需要详细的设计建议 . 我只需要一个关于 每日销售 表。有没有办法打破这个特定的表来实现粒度?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Damir Sudarevic    9 年前

    您要查找的是数据仓库(DW)。我建议你看看拉尔夫·金博尔的《数据仓库工具包》,它有一些零售数据仓库设计的例子。下面是一个非常简单的(初稿)示例,说明它的外观。您会注意到,这是一个为报告和分析而优化的非规范化结构。事实数据表的纹理通常是收据上的一个项目(行)。希望这能让你找到解决方案。对于DW来说,几兆字节是可以的。


    storedw_model_01

        2
  •  1
  •   Konamiman    15 年前

    如果要生成大量数据,并且需要根据过去的数据生成报告,则应考虑使用 business intelligence 发动机。通常,这些引擎允许您将历史数据归档到单独的数据存储中(这样您就不会使日常工作数据库混乱),同时还可以从归档数据中获取统计数据和报告。

        3
  •  1
  •   James Black    15 年前

    为什么不在产品上写上日期和价格,这样你就可以从Dailysales表中降低价格,因为你可以通过加入来获得它。

    除非销售人员可以更改价格,数据库中没有任何理由。

    在一个特定的日期,一个销售员只能在一个销售点吗?如果是这样的话,你就可以去掉异常值。

    您有PriceID、SalesPrice和折扣。如果我知道折扣和卖场ID以及原始价格,那么我可以确定税收,然后计算销售价格,这样你就可以降低它了。

    但是,这意味着您正在按日期存储税务信息,以跟踪销售发生时的情况。

    我的观点是,您应该查看另一个表中已经存在的内容,然后可以简化每日销售表。

    例如,您希望按天/月/年将信息从中提取到临时表中,以帮助按日期聚合数据,以便更快地生成报告。

    你的问题中有很多未知数,但希望这能有所帮助。

    更新: 基于评论

    我有一个表,其中包含有关某人何时使用资源的使用信息,该表很快就变大了。因此,我们决定只保留2到3年的数据,其余的数据将被聚合,原始数据被转储到一个文件中存档。

    当查看行数时,您需要决定需要保留多少数据,以及如何存档旧数据,以便在绝对需要时使其可用,但是,您可以生成事先需要的报告。

    通过减少列的数量,您将对存储空间产生很大的影响,在这种情况下,许多列可能不会为空。