这是最近向我提出的一个很好的问题。假设我们有一个假设的(在此处插入您最喜欢的数据存储工具)数据库,其中包含居住在这个星球上的所有人的姓名、年龄和地址。您的任务是在 HTML 表格中打印出所有年龄大于 18 岁的人的姓名。你会怎么做呢?假设人口以每秒 1200 人的速度增长,并且数据库相应地更新(不要问如何)。在 HTML 表格上打印所有这些人的姓名及其地址的策略是什么?
3 回答
将年龄存储在数据库表中听起来像是给我带来麻烦的秘诀——这是不可能维护的。您最好存储出生日期,然后在该列/属性上建立索引。
您必须获取表的初始转储以进行显示。只需计算 18 年前的日期(比方说
D0
)并使用查询来查找比该日期更早出生的任何人。使用数据库触发器接收有关死亡的通知,以便您可以立即将它们从表中删除。
由于人们只会变老(不幸的是?),因此您可以使用范围查询来获取新添加的内容(即自上次查询表以来已年满 18 岁的人)。例如,如果您想在第二天更新显示,您只需查询当天出生的人
D0 + 1
- 无需再次请求整个表格。您甚至可以预取第二天达到 18 岁的人,将这些条目保存在内存中,并在他们达到那个年龄的确切时刻将它们添加到显示中。
顺便说一句,即使每个人有 2KB 的数据,你也会得到一个 18TB 的数据库(假设有 50% 的开销)。任何稍微增强的服务器都应该能够处理这种数据库大小。另一方面,一个 12 TB 的HTML表的想法让我感到害怕......
哦,注意时区和 DST 问题 - 现在时间是一个相对的东西......
我不明白问题是什么。您根本不必担心会添加新记录,因为它们都不会包含在您的查询中,除非该查询需要 18 年或更长时间才能运行。如果您有一个关于年龄的索引,并且可能任何足以处理那么多数据并且 1200 次插入第二次更新插入时的索引的数据库技术,它应该可以工作。
在现实世界中,使用现有技术或类似技术,我会每天创建一次快照,并对不包含当天记录的只读快照进行查询。该表对于这个查询和大多数其他查询肯定足够好。
您是否被迫将所有条目汇总到一张表中?
如果您要为每个年龄组创建一个表(只需要大约 120 个表)并将输入插入到这些表中会更简单,因为在插入条目时查看超过 120 个表在计算上比查看更简单6,000,000,000 在寻找条目时。