database - 在数据库中存储以下时态数据的最佳方式

标签 database performance database-design temporal

假设我们有一组实体,每个实体都有自己的状态:空闲、忙碌或损坏。状态指定为一天,例如今天2011-05-17实体E1空闲,明天2011-05-18实体E1忙。

需要存储 ~10^5 个实体 1000 天。哪种方法最好?

我正在考虑两个选择:

  • 将每一天表示为字符“0”、“1”或“2”,并为每个实体存储 1000 个字符的字符串
  • 将每天的实体状态存储在一行中,即一个实体 1000 行

此类数据最重要的查询是:给定的开始日期和结束日期确定哪些实体是免费的。

性能比存储具有更高的优先级。

欢迎所有建议和意见。

最佳答案

最好的方法是首先尝试更简单、更灵活的选项(即,将每一天存储在自己的行中),并且仅在性能不令人满意时设计复杂的替代方法。避免过早优化。

对于当今商用服务器上的普通数据库来说,10^8 行并不是什么大问题。在日期上放置一个索引,我敢打赌范围查询(“给定开始日期和结束日期......”)会很好地工作。

我声称这比存储 1000 个字符的字符串更简单、更灵活的原因是:

  • 您必须在代码中处理此问题,并且该代码不像查询包含日期和状态的数据库记录的代码那么容易理解。
  • 根据数据库引擎的不同,1000 个字符串可能是存储在记录外部的 blob。这降低了他们的效率。
  • 如果您突然需要 2,000 天而不是 1,000 天,会发生什么情况?开始更新所有行以及处理它们的代码?这比仅仅更改查询要多得多的工作。
  • 当您下次被要求为每条每日记录存储一些附加信息或需要更改粒度(例如从几天改为几小时)时,会发生什么情况?

关于database - 在数据库中存储以下时态数据的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6031050/

相关文章:

mysql - 硬连接查询

mysql - 如何更改 mysql 表列的默认值?

java - 查询索引数据库的java代码与查询未索引数据库的java代码相同吗?

sql-server-2005 - 如何对高度规范化的数据库系统进行非规范化?

jquery - 监听器 : OK to run on every page, 或仅在需要它们的页面上初始化?

java - 为什么我的 .jar 文件运行速度比 eclipse 中的程序慢?

sql - 标签或标记的数据库设计

php - 为什么在同一文件中使用自定义函数时,每次都需要重新连接到数据库?

database - 数据库规范化和单场突破

python - appengine python(bigtable)中的父->子关系