使用JSON而不是规范化数据,这种方法是否正确?

Dhr*_*hak 6 mysql json innodb denormalization

在MySQL innoDB表中都有微博帖子和与它们相关的投票/表情符号.需要两种类型的页面:

(A)包含许多微博的列表页面以及他们的投票计数/表情符号在单页上计数(比如说25).

例如

伟大的有趣的帖子

不是那么有趣的内容,意味着有趣的帖子.Lorem ipsum dolor坐下来,精致的adipistur elit.Phasellus euismod consequat pellentesque......阅读更多....

(3)喜欢,(5)无聊,(7)微笑

.+ 24个同一页面上的帖子.

(B)永久链接页面包含一个具有详细投票+投票计数/表情符号的微博.

伟大的有趣的帖子

不是那么有趣的内容,意味着有趣的帖子.Lorem ipsum dolor坐下来,精致的adipistur elit.Phasellus euismod consequat pellentesque.Quisque viverra adipiscing auctor.Mauris ut diam risus,在fermentum elit.Aliquam urna lectus,egestas sit amet cursus et,auctor ut elit.Nulla tempus suscipit nisi,nec condimentum dui fermentum non.在eget lacus mi,ut placerat nisi.

(你,Derp和1更像这样),(5)无聊,(7)微笑

第一种方法:

表格1:

post_id | post_content | post_title | creation_time 
Run Code Online (Sandbox Code Playgroud)

表#2用于存储投票,喜欢,表情符号:

action_id | post_id | action_type | action_creator | creation_time
Run Code Online (Sandbox Code Playgroud)

显示帖子页面或单个帖子.查询第一个表以获取帖子,查询第二个表以获取与帖子相关的所有操作.无论何时完成投票等,都会在post_actions表格中插入一个插入内容.

第二种方法:

表格1:

post_id | post_content | post_title | creation_time | action_data 
Run Code Online (Sandbox Code Playgroud)

哪里action_data可以是类似的东西{ "likes" : 3,"smiles":4 ...}

表2:

action_id | post_id | action_type | action_creator | creation_time
Run Code Online (Sandbox Code Playgroud)

要显示帖子页面,查询第一个表格以获取帖子和操作数据,显示具有详细操作的单个帖子,查询第二个表格以获取与帖子相关的所有操作.每当完成投票等时,在post_actions表中进行插入,并且更新表#1的action_data字段以存储更新的计数.

假设有100K帖子和10x动作,即创建了100万或更多动作.方法#2是否有益处?除了必须阅读,修改和更新JSON信息之外,它有什么缺点吗?无论如何,有哪种方法可以遵循并进一步改进?

根据反馈添加更多信息:

  1. Python脚本将读取,写入数据.
  2. MySQL数据库服务器与Web服务器不同.
  3. 由于帖子创建而写的写作每天低Ie 10000.但是那些由于操作原因可能更高,假设由于投票,喜欢,表情等行为而每秒最多写入50次.
  4. 我关注的是第二种方法的读取/写入性能比较和第二种方法的问题,以及未来可能达不到的地方.

Mar*_*ler 7

我建议将所有喜欢/投票数据(聚合和原子)存储在表1中并完全丢弃表2 使用2个表而不使用聚合数据,同时依赖JOIN语法,聪明的查询和良好的索引.

为什么?因为否则你会在评论/投票/喜欢的时候一直查询和写入两个表格.假设每个帖子只有10个动作用于显示交互,我真的将它全部存储到1个表中,可能为每种动作制作一个额外的列.您可以使用JSON或仅使用serialize()数组,这应该更快一些.

您最终选择的解决方案将高度依赖于您获得的操作数量以及您希望如何使用它们.使用解决方案1可以轻松获得1个帖子的所有操作并且速度非常快但在内部搜索会很麻烦.另一方面,解决方案2占用更多空间,仔细查询和编写索引.