我正在处理的项目的大多数内容类型和类别都有许多与每个内容,页面,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
我非常清楚,只有少数类型的内容,内容元表会快速增长
从性能的角度来看,您如何看待这种类型的设计?我应该放弃它吗?
答案 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