我正在重新设计一个可能包含大量数据的数据库 - 我可以选择在数据库中包含许多不同的列,也可以使用大量的行.如果我在下面做了某种大纲,可能会更容易:
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中将多行转换为可用的列格式(我猜临时表) - 所以我可以按内容类型进行一些过滤,作为一个例子.
对于传统的基于行的存储,通过行进行假脱机的成本将取决于其宽度,因此扫描具有宽行的表将比扫描具有窄行的表花费更长的时间。
也就是说,如果您使用索引来定位感兴趣的行,那么这不会是一个太大的问题。
如果通过用其他表中的行的键替换列来规范化数据,则如果链接表最终明显小于原始表,则可以减少存储量,但是任何查询都需要将所需联接的成本包括在相关表。
与所有这些事情一样,这是一个取决于您的要求的平衡行为,但了解幕后发生的事情肯定可以帮助您做出更明智的决定。