我是MySQL的数据库管理员和开发人员。我和MySQL一起工作了几年。我最近询问和研究O'Reilly高性能MySQL第二版,以提高我在MySQL高级功能,高性能和可扩展性方面的技能,因为我经常因为缺乏MySQL的先进知识而感到沮丧(并且在很大程度上,我还有。)
目前,我正在开发一个狡猾的网络项目。在这个项目中,我们将从一开始就拥有相当的内容和用户。我是数据库的设计者,这个数据库必须非常快(一些插入但主要是更重要的READS)。
我想在这里讨论这些要求:
我有一些基本的设计疑问,我希望你帮我决定和学习哪种设计方法对于高性能的MySQL数据库更好。
经典方式
下图显示了在数据库中思考思维的第一个问题: Database diagram
集中接种
但也许我们可以用一些或伪对象导向的范例来改进它,将一般项目和关系集中在一个公共项目表上。列出所有类型的项目也很有用: Database diagram
提前全部感谢!!
答案 0 :(得分:1)
您拥有两种截然不同的数据映射策略。你称之为“经典”的是“其他来源中的每个具体类一个表”,而你称之为“集中式”的是“每个类一个表”(Mapping Objects to Relational Databases: O/R Mapping In Detail)。它们都有其优点和缺点(按照上面的链接)。第一个策略中的查询会更快(在第二个策略中,您只需要加入2个表而不是3个。)
答案 1 :(得分:0)
我认为你应该探索经典的超类型/子类型模式。以下是来自SO的 some examples 。
答案 2 :(得分:0)
如果您主要关注速度,请考虑选择性地使用MyISAM表,使用集中的“对象”表,并在此表单上只添加一个具有正确索引的表:
object_type | object_id | property_name | property_value
user | 1 | photos | true
city | 2 | photos | true
user | 5 | single | true
city | 2 | metro | true
city | 3 | population | 135000
等等......例如,对主键或索引键(object_type,object_id,property_name)的查找速度非常快。此外,当您显示新属性时,无需以457表结束。
它不是一个精心设计的,也不是完全规范化的数据库,如果你正在寻找一个长期的大型网站,你应该考虑缓存,或者至少使用非规范化的范例,像这样的非规范化的mysql表,redis,或者MongoDB。