【发布时间】:2015-07-23 04:26:10
【问题描述】:
我正在处理的项目的大多数内容类型和类别都有许多与每个内容、页面、blog_articles、blog_tags、recipes、recipes_categories、广告、横幅、封面、客户等相关的表格。
所有这些表的共同点和在每个表中重复的是标题、标签、描述,只有少数有其他字段,例如食谱有成分|方法|级别_of_difficulty等等。
我的想法是去掉许多表并将其缩小到只有两个表,有点像 wordpress 的帖子和 postmeta。
例如
content_table
-------------
id
parent_id
type
title
slug
body
content_meta
-------------
id
content_id
type
key
value
在 content_meta 中,我正在考虑做这样的事情
content_meta
----------------------------------------------------------
| id | content_id | type | key | value
----------------------------------------------------------
| 1 | 1 | banner | image | img.jpg
| 2 | 1 | banner | link_to | google.com
| 3 | 2 | recipe | ingredient | milk
| 4 | 2 | recipe | method | stir it
| 5 | 2 | recipe | difficulty | medium
我很清楚,只有少数类型的内容,内容元表会快速增长
从性能的角度来看,您如何看待这种类型的设计,我应该放弃它吗?
【问题讨论】:
-
性能会很糟糕,因为您否定了能够使用关系数据库的主要目的:关联数据。您将无法轻松(或根本无法)
join,或使用聚合函数,等等等等。本质上,您正在将您花哨的 DBMS 变成一个愚蠢的键值存储系统。 -
我明白了,所以 wordpress 也在做同样的事情,否定相关数据?
-
不说这总是一个坏主意。如果您有非结构化数据,那么键值存储是使用数据库存储它的唯一实用方法。但总的来说,如果您希望进行连接/聚合,那么不要使用键值。使用正确设计/规范化的关系设置。
-
@MarcB 性能和存储如何,我很好奇为什么 wordpress 使用这种设计模式,我试图找出原因但找不到太多,我知道利弊,但是怎么样表现?。既然你的名声不错,也许你能解释一下我的好奇心?
-
它对任意存储很有用,例如关键字系统。有无限多的潜在关键字,您不想浪费表空间为每个可能的关键字定义一列。所以你选择
id, name, value。但是这种键/值对被构建“企业”软件的人严重滥用:thedailywtf.com/articles/The_Inner-Platform_Effect
标签: mysql design-patterns