用户数据和更改日志的哪种布局是最有效的,更少的存储消耗?

时间:2012-11-13 16:38:53

标签: mysql sql postgresql

我的用户可以更新他们的信息,这些信息会保存在表格中定义数量的列中,例如:user ( id INT, email VARCHAR, phone VARCHAR, address VARCHAR )

我见过其他一些实现,比如Wordpress的实现,它将这些信息存储在一个名为usermeta的表中,其布局为( umeta_id INT, user_id INT, meta_key VARCHAR, meta_value VARCHAR )

在我想要实现的更改日志中,我正在评估使用这样的解决方案或制作(我认为会更好),布局如:userLog ( id INT, date TIMESTAMP, email VARCHAR, phone VARCHAR, address VARCHAR )
因此,我可以记录任何用户在给定日期所拥有的所有信息。行只会记录更改,在未更改的列上为NULL。

对于第一个问题:除了能够通过插入适当的meta_key来创建新的信息类型之外,这种布局是否有任何优势? 我有时认为如果性能在我的环境中是一个问题,这种布局可能不太合适,因为我会对我想要存储的每种数据使用VARCHAR

对于第二个问题:存储和选择/插入效率能否真正改变我正在考虑的两种解决方案?
哪个解决方案应该比其他解决方案更少(或更多)占用空间和/或更少(或更多)选择/插入效率?为什么?

1 个答案:

答案 0 :(得分:1)

最好的选择很大程度上取决于你想要做什么,因此你会运行什么样的查询(就像许多事情一样)。

我不太了解WordPress(我知道你将各个字段存储为行,但我不知道它在哪里),所以我只列出所有字段选项:

  1. 让用户和历史记录表存储每行的单个字段
  2. 每行只有历史表存储单个字段
  3. 每行只有用户表存储单个字段
  4. 每行都不存储单个字段
  5. 为用户和历史记录提供1个组合表
  6. 每行存储1个组合表以存储单个字段
  7. 在大多数情况下,(5)和(6)看起来并不像是选项,因为我怀疑你想要比你更频繁地获得用户(或一堆用户)的详细信息我想要获取历史记录(除非你的大部分疑问是同时获得两者)。

    不建议使用

    (1)和(3),除非许多细节没有填写(因此在其他情况下你最终会得到非常稀疏的表格)。

    (4)是因为用户倾向于一次性更改所有细节,这可能不会经常发生,我怀疑人们一次只能更改1或2个字段。所以,(2)可能是一个更好的选择,特别是如果用户表有很多字段(人们一次只更改1或2个字段)。

    通常,每行存储单个字段是为了减少存储空间以上的性能(假设存在一些空字段,否则每行存储单个字段会更糟糕),您基本上通过查看您的要求来确定哪个是最佳的预期的数据。注意我们主要谈论的是选择这里,这通常是缓慢的操作,除非你有一些奇怪的东西,或一次大量的插入。对于历史来说,减少存储通常优于性能,因此(2)。

    无论如何,添加字段通常都需要付出一些努力,所以只需说“更新用户添加字段”即可。这不是什么大问题,它甚至可以实现自动化。这是(2)高于(4)的另一个(小)理由。