Database design 如何优化此数据的访问?

Database design 如何优化此数据的访问?,database-design,optimization,normalization,Database Design,Optimization,Normalization,我有一张由200家公司的股票价格组成的5年表。这是一个大表,包括公司名称、未平仓、高位、低位、收盘、日期 我现在需要对同一个数据库进行一些处理,并允许用户(最多10个)访问该数据库,以获取关于不同参数集和查询的报告 我应该按原样使用数据库,还是你有什么建议让它更优化 谢谢。如果数据只是公司名称,那么它已经被规范化了。如果有更多关于该公司的信息,如地址、电话等,那么你应该将其分为一个单独的表格。我会为该公司准备一个表格,并为给定日期的股票价格准备一个表格(开盘/高点/低点/收盘位),保存在任何地方

我有一张由200家公司的股票价格组成的5年表。这是一个大表,包括公司名称、未平仓、高位、低位、收盘、日期

我现在需要对同一个数据库进行一些处理,并允许用户(最多10个)访问该数据库,以获取关于不同参数集和查询的报告

我应该按原样使用数据库,还是你有什么建议让它更优化


谢谢。

如果数据只是公司名称,那么它已经被规范化了。如果有更多关于该公司的信息,如地址、电话等,那么你应该将其分为一个单独的表格。

我会为该公司准备一个表格,并为给定日期的股票价格准备一个表格(开盘/高点/低点/收盘位),保存在任何地方复制公司信息。

拉出名称并使用整数ID。它应该更快,并允许名称更改。股票符号也可以被提取到父表。

< P>我想你需要考虑这份报告,比如说,它们会一直逐月进行吗?如果是这样,您可以创建一个聚合数据表


否则,我认为仔细的索引是性能的唯一选择

我会为日期添加一个UID字段和几个维度(即年表、年+月表、年+季度表、会计年表等)。

规范化和优化并不总是一回事


您的用户将如何处理这些数据?

这不是一个优化(尽管您可能会认为这是一个标准化,前提是公司可以更改名称):

有关密钥生成的信息,请参见

顺便问一下,你是如何处理公司更名的?忽略它将是一个简单的答案,但它是正确的吗?:)

因此,不管怎样,如果表太大而无法获得良好的性能,我会选择它。

对某人的错误引用:

优化规则
  • 不要这样做
  • 仅供专家参考:暂时不要这样做
  • 如果问题是“……我是不去管它,还是我
    让它更优化”
    ”,请不要管它,直到通过测量知道存在问题为止

    如果查询或更新表时出现问题,请使用有关查询、任何索引、更新/访问表的频率等详细信息更新您的问题。此时您将得到各种建议


    正如前面提到的,只要规范化,您可以考虑在表中多次出现相同的公司名称时将公司名称提取到自己的表中。

    规范化和优化是不同的。例如,您可以通过标准化来改进数据完整性。或者您可以优化以改善用户体验—提高获取时间。什么对你来说很重要?这是一个很好的评论,大多数答案都是关于优化而不是规范化的。它们是两件不同的事情,虽然在这种情况下,我会说,没有太多的优化要做。问题不是优化,而是规范化。好吧,我永远不会跳出框框,坐在我的无知洞穴里思考。标准化的空间很小,他的问题显然是查询速度。我的回答不是关于正常化的,不是,但它解决了他潜在的问题。我认为,重要的是,在提出问题时理解这个主题。规范化是数据库设计的一个重要部分,不应与优化混淆。我认为这张表也不需要优化。不,我同意你的看法,不过,我只是想提出一些他可能没有想到的想法来帮助我们。每个分析师都有自己的问题,没有什么是固定的。正如Ken(下文)所说,如果事情进展缓慢或出现问题,我可以发布它。谢谢你的时间和建议。警告:我只写了这个,根本没有测试它。它可能不起作用:)我以前的帖子很早就发布了。对于原始数据,它实际上不会使检索速度提高很多,而且可能会因为连接而稍微降低检索速度。如果您正在添加任何其他公司数据,或者允许更改名称,那么规范化是有价值的。
    CREATE TABLE company (
      id INTEGER PRIMARY KEY, -- Well, this would be a serial, but that works different in different DBMS
      name VARCHAR(256) UNIQUE
    );
    
    CREATE TABLE price (
      company_id INTEGER REFERENCES company(id) NOT NULL,
      date  TIMESTAMP NOT NULL,
      open  DECIMAL, -- Just grabbed a type here, probably not right for you.
      high  DECIMAL,
      low   DECIMAL,
      close DECIMAL,
    
      PRIMARY KEY(company_id, date)
    );