我正在运行一个网络抓蜘蛛,每天擦掉近100万件产品。 我正在考虑两种方法: 1)将所有产品的价格历史存储在一个表中
product_id, date, price
但这会在此表中产生数百万条记录。
2)将数据存储在多个表格中为每个产品制作单独的表格。
Table1: product_id, current_price
Table_product_id: date, price
Table_product_id: date, price
Table_product_id: date, price
但我会有近100万张桌子!
答案 0 :(得分:2)
从理论的角度来看,您应该使用相同的模式来存储同一实体的实例(例如,您的产品类型)。根据这一点,解决方案1应该是首选。
在现实世界中,高数据基数可能是个问题。例如,MongoDB
使用sharding来管理非常大的数据集。 PostgreSQL
允许partitioning。来自PostgreSQL的文档:
分区是指将逻辑上的一个大表拆分 变成较小的物理碎片。分区可以提供几个 好处:
- 在某些情况下,查询性能可以得到显着提高,特别是在大多数访问量很大的行时 该表位于单个分区或少数 分区。分区替代了前导列 索引,减少索引大小,使其更有可能 索引中使用频繁的部分适合内存。
- 当查询或更新访问单个分区的大部分时,可以通过利用
来提高性能 顺序扫描该分区而不是使用索引和
随机访问分散在整个表格中。- 如果计划在分区中,则可以通过添加或删除分区来完成批量加载和删除 设计。 ALTER TABLE NO INHERIT和DROP TABLE都快得多 而不是批量操作。这些命令也完全避免了VACUUM
批量删除导致的开销。- 很少使用的数据可以迁移到更便宜和更慢的存储介质。
只有当一张桌子出现时,这些好处通常才有价值 否则会非常大。 表格的确切位置 分区的好处取决于应用程序,虽然是一个规则 拇指是表的大小应该超过物理 数据库服务器的内存。
正如他们所提到的,这取决于您的具体用例。最后一句可能是您做出选择的标准。