Mysql数据库设计一个表有多个键值行表现?

时间:2015-07-22 20:02:18

标签: mysql design-patterns

我正在处理的项目的大多数内容类型和类别都有许多与每个内容,页面,blog_articles,blog_tags,食谱,食谱类别,广告,横幅,封面,客户等相关的表格。

所有这些表在每个表中共同重复的是标题,段塞,描述,其中只有少数有其他字段,如食谱有成分|方法| level_of_difficulty等。

我在想的是摆脱许多桌子并将其缩小到只有两张桌子,有点像帖子和postmeta的wordpress。

例如

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

我非常清楚,只有少数类型的内容,内容元表会快速增长

从性能的角度来看,您如何看待这种类型的设计?我应该放弃它吗?

1 个答案:

答案 0 :(得分:0)

最好是合并某些表或删除冗余列。

content_meta的想法可能会在以后进行一些非常讨厌的查询,当“密钥”是动态的时候可能会使用这个概念。您将不得不依赖于content_meta表中每个字段的多个子查询(或JOIN),而不是单个查询。

SELECT title, body, ingredient, method FROM content_table 
INNER JOIN recipes ON content_table.content_id = recipes.content_id

VS

SELECT title, body, rIngredient.value 'ingredient', rMethod.value 'method' FROM content_table
LEFT JOIN content_meta rIngredient ON content_table.content_id = rIngredient.content_id AND type = 'recipe' AND key = 'ingredient'
LEFT JOIN content_meta rMethod ON content_table.content_id = rMethod.content_id AND type = 'recipe' AND key = 'method'

您可能希望查看数据库规范化:https://en.wikipedia.org/wiki/Database_normalization