拥有更多列或更多行的效率更高?

MrJ*_*MrJ 6 mysql

我正在重新设计一个可能包含大量数据的数据库 - 我可以选择在数据库中包含许多不同的列,也可以使用大量的行.如果我在下面做了某种大纲,可能会更容易:

item_id | user_id | title | description | content | category | template | comments | status
-------------------------------------------------------------------------------------------
1       | 1       | ABC   | DEF         | GHI     | 1        | default  | 1        | 1
2       | 1       | ZYX   |             | QWE     | 2        | default  | 0        | 1
3       | 1       | A     |             | RTY     | 2        | default  | 0        | 0
4       | 2       | ABC   | DEF         | GHI     | 3        | custom   | 1        | 1
5       | 2       | CBA   |             | GHI     | 3        | custom   | 1        | 1
Run Code Online (Sandbox Code Playgroud)

与以下结构中的内容相对应:

item_id | user_id | attribute   | value
---------------------------------------
1       | 1       | title       | ABC
1       | 1       | description | DEF
1       | 1       | content     | GHI
...     | ...     | ...         | ...
Run Code Online (Sandbox Code Playgroud)

我可能希望将来创建其他属性(参数为50) - 因此如果使用多列,可能会有很多空单元格.在可能的情况下,属性名称将在不同类型的内容(例如博客条目,事件和图库)title中重复使用,可以轻松地重复使用.

所以我的问题是,在查询速度和磁盘空间方面,使用多列还是多行更有效.或者你会建议关系表,所以有一个博客表,一个事件表等等.我只是想提出一个易于扩展的解决方案,我理想情况下不想为每种类型创建一个表内容,因为我正在考虑开发人员通过app/API系统创建新类型的内容(属性受到严格控制).

多行的补充问题

我怎么能在MySQL中将多行转换为可用的列格式(我猜临时表) - 所以我可以按内容类型进行一些过滤,作为一个例子.

Jon*_*n G 2

对于传统的基于行的存储,通过行进行假脱机的成本将取决于其宽度,因此扫描具有宽行的表将比扫描具有窄行的表花费更长的时间。

也就是说,如果您使用索引来定位感兴趣的行,那么这不会是一个太大的问题。

如果通过用其他表中的行的键替换列来规范化数据,则如果链接表最终明显小于原始表,则可以减少存储量,但是任何查询都需要将所需联接的成本包括在相关表。

与所有这些事情一样,这是一个取决于您的要求的平衡行为,但了解幕后发生的事情肯定可以帮助您做出更明智的决定。