我的用户可以更新他们的信息,这些信息会保存在表格中定义数量的列中,例如: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
。
对于第二个问题:存储和选择/插入效率能否真正改变我正在考虑的两种解决方案?
哪个解决方案应该比其他解决方案更少(或更多)占用空间和/或更少(或更多)选择/插入效率?为什么?
答案 0 :(得分:1)
最好的选择很大程度上取决于你想要做什么,因此你会运行什么样的查询(就像许多事情一样)。
我不太了解WordPress(我知道你将各个字段存储为行,但我不知道它在哪里),所以我只列出所有字段选项:
(1)和(3),除非许多细节没有填写(因此在其他情况下你最终会得到非常稀疏的表格)。
(4)是因为用户倾向于一次性更改所有细节,这可能不会经常发生,我怀疑人们一次只能更改1或2个字段。所以,(2)可能是一个更好的选择,特别是如果用户表有很多字段(人们一次只更改1或2个字段)。
通常,每行存储单个字段是为了减少存储空间以上的性能(假设存在一些空字段,否则每行存储单个字段会更糟糕),您基本上通过查看您的要求来确定哪个是最佳的预期的数据。注意我们主要谈论的是选择这里,这通常是缓慢的操作,除非你有一些奇怪的东西,或一次大量的插入。对于历史来说,减少存储通常优于性能,因此(2)。
无论如何,添加字段通常都需要付出一些努力,所以只需说“更新用户添加字段”即可。这不是什么大问题,它甚至可以实现自动化。这是(2)高于(4)的另一个(小)理由。