【问题标题】:Normalization of SQL Database with similar data managed by different tools具有由不同工具管理的相似数据的 SQL 数据库的规范化
【发布时间】:2016-07-22 13:04:52
【问题描述】:

我正在设计一个用于存储大量产品数据的数据库,这些数据既可以通过 API 提取,也可以从网络上抓取。这个爬虫会拉取一些静态数据和一些随时间变化的数据。因此,每种类型的数据(静态/变量)都有一个表。我试图决定是否应该有一个单独的表来存储与通过 API 提取的可变数据相比被抓取的可变数据。

起初,我认为它们应该存储在单独的表中,因为它们是由单独的工具管理的。但是,数据将通过 API 提取并按照相同的计划(每天)进行抓取,因此它们都将使用相同的 ProductID 和日期进行映射。因此,似乎我可以将两个表的模式结合起来,以节省查询期间的连接时间,以便稍后处理数据。这样做的明显缺点是管理是否需要在其中一个进程运行时创建或更新行(刮板工具与 API 工具中的哪个创建或更新行)。

不管怎样,这些脚本每天将提取数百万(可能是数千万)行的数据,并将其存储很长一段时间。所以,表格会变得非常大,这就是我稍后关心连接时间的原因。

这是一个示例,以防万一这一切都有些模糊。这有多个行业,但我只会使用房地产:
抓取的静态数据:ProductID、地址、城市、州、邮编、SquareFeet 等。
抓取的变量数据:ProductID、Price、PricePerSqFt 等
API 变量数据:ProductID、PageHits、UniqueVisitors 等

这里主要关注的是变量数据。所以,只是总结一下,为了一般的设计原则,单独的表,还是为了连接速度而一张表?

提前感谢您的意见

【问题讨论】:

    标签: sql database-design database-normalization


    【解决方案1】:

    您给出的示例表明,除了有 2 或 3 个表之外,您还应该考虑只为静态和可变数据使用一个表。只要一切的关键只是产品 id,您就可以将描述特定 id 值的所有信息保存在一条记录中。或者您是否打算将时间戳作为变量数据键的一部分?

    一旦确定了这一点,我就看不出拥有比必要更多的桌子有什么好处。

    • 您提到的联接不会特别复杂,因为它们基本上意味着从每个表中读取一条记录,每次使用主键,速度很快。但是仍然阅读 3 条记录意味着比阅读 2 条或只阅读 1 条更努力。

    • 没有通用的设计原则说您应该为每种收集数据的方式设置一个单独的表。相反,数据库的目的是根据其逻辑结构包含数据,而无需(过多)考虑收集或访问它们的技术手段。

    • 决定是插入还是更新行的逻辑并不复杂。此外,如果你想验证你的数据,你可能需要一些逻辑,例如确保只为已经有静态数据的对象插入可变数据。

    【讨论】:

    • 变量数据也将使用时间戳进行键控。我忘了在示例模式中添加它。将变量和静态数据保留在同一个表中似乎没有意义,因为静态数据将在同一项目的每一行中重复,这似乎没有必要。那么,通过日期键控,您会推荐两张表,还是只考虑一张?感谢您的回复
    • 当时间戳是key的一部分,即你打算每条产品记录有多个可变数据记录,那么可变数据需要在单独的表中,以避免静态数据的冗余.
    猜你喜欢
    • 2016-07-23
    • 2016-04-02
    • 2017-10-10
    • 2011-05-17
    • 2011-07-12
    • 1970-01-01
    • 2011-04-12
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多