我目前正在为我正在构建的产品设计数据库体系结构。在开始在MySQL中创建所有内容之前,我只是在Excel文件中绘制所有内容。
当前,我有两个几乎完全相同的表。
TABLE A
,其中包含每个用户每个数据点的最新值。
TABLE B
包含每个用户每个数据点的每日记录。
我创建TABLE A
而不是或仅依靠TABLE B
的理由是,TABLE B
中的行数每天都会随着我拥有的客户数而增长。例如,假设我有20,000个客户,TABLE B
每天将增加20,000行。因此,通过创建TABLE A
,我将只需要搜索20,000条记录来为每个用户找到每个数据点的最新值,因为我每天都会更新这些值;而对于TABLE B
,我将不得不搜索数量不断增长的行,以获取每个用户的最新插入内容。
这是可接受的还是好的做法?
还是我应该忘记TABLE A
来减少数据库中的“膨胀”?
答案 0 :(得分:1)
这不是正确的方法。您基本上有两个合理的选择:
您可以管理两个表,但这很麻烦,并且有内置方法可以处理这种情况。
答案 1 :(得分:0)
在我既需要“当前”数据又需要“历史记录”的情况下,这就是我要做的事情-一张带有当前数据的表和一张带有历史的表。对于不同的用法,它们的索引可能会有所不同,等等。
我会仔细考虑一下“历史”和“当前”之间的区别,然后使表不同而不相同。
当有新记录(或您的情况下为2万行)出现时,我至少会将其放入Current
中。我还可以将其写入History
,从而使其完整(以少量冗余为代价)。或者,当下一行进入History
时,我可以将行移至Current
。
除非我打算清除“旧”数据,否则我认为不需要PARTITIONing
。在这种情况下,我将使用PARTITION BY RANGE(TO_DAYS(..))
并选择每周/每月/不限分区数,以使分区数不超过约50。(如果选择“ daily”,History
将在几秒钟后变慢几个月,只是因为分区。)
每天2万行-自昨天以来,其中许多行是否保持不变?那可能不是做事的正确方法。请详细说明每天发生的情况。您应该避免在History
中重复行(日期除外)。