【问题标题】:Mysql database design one table many key value rows performance?Mysql数据库设计一张表多键值行性能?
【发布时间】: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


【解决方案1】:

合并一些表或删除冗余列会更好。

content_meta 的想法可能会在以后产生一些非常讨厌的查询,当“key”是动态的时可能会使用这个概念。对于 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

【讨论】:

  • 这很有意义,我会坚持使用普通的枪支,没有什么未来感
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多