【问题标题】:Which one of those two schemas is more scalable?这两种模式中的哪一种更具可扩展性?
【发布时间】:2010-11-30 13:20:20
【问题描述】:

我正在玩弄两种模式,但我无法决定哪种模式更具可扩展性。该模式用于问答,它内置在 MySQL 中。人们发布问题/答案并喜欢/不喜欢/最喜欢的问题和答案。一个问题可以有很多答案/喜欢/不喜欢,一个答案也可以。

要向用户阅读问题,两种模式都需要相同数量的连接,但连接的处理方式不同:

架构 1

questions(id, title, body, userId)
questionLikes(id, questionId, userId)
questionDislikes(id, questionId, userId)
quetionComments(id, questionId, body, userId)
answers(id, questionId, body, userId)
answerLikes(id, answerId, userId)
answerDislikes(id, answerId, userId)
answerComments(id, answerId, userId, body)
favourites(id, questionId, userId)

这更规范化,更容易开发,但可扩展?似乎有很多重复的信息。抓取问题的连接序列是针对用户的(我们希望包括他的喜欢/不喜欢活动)

select question
join answers
join questionLikes
join questionDislikes
join questionComments
join favouites 
join answers to answerLikes
join answers to answerDislikes
join answers to answerComments (multiply answer joins by number of answers)

架构 2

posts(id, postTypeId, userId, title, body)
postTypeId(id, postType)
comments(id, postId, userId)
votes(id, voteTypeId, userId)
voteTypeId(id, voteType)

这不太规范化和紧凑,似乎可以更好地扩展,自联接和其他开发问题(条件验证)会让人头疼。抓取问题的连接序列是

select question and its answers in the same read using where @id for question, and @questionId for answers; each row, join the following:
join votes on as likes on voteType 1
join votes as dislikes on votetype 2
join comments
join favouites (multiply joins by number of rows)

那么什么会更好地扩展?我知道可以添加一些额外的字段来存储计数,因此不需要连接。但是两者都需要相同数量的连接,我无法下定决心。

【问题讨论】:

  • 我在阅读您的问题时并没有走得太远,但是为什么您会有 2 个不同的表用于 questionLikes 和 questionDislikes ???我想同样的评论可以进一步应用于你的架构。
  • 因为问题和答案可能具有相同的 ID,因为它们是不同的对象。

标签: database-design schema


【解决方案1】:

我会比 2 更进一步。问题是,您的模型中的实体是什么?答:用户和帖子。帖子可以是问题、答案、投票、评论或其他任何内容,但它始终是帖子。因此

posts(id, postTypeId, userId, title, body)
postTypeId(id, postType)

顺便说一句,您提到的两个选择都会检索所有内容(或者它们只是为了显示最糟糕的连接?)。

我不会看到自己一次性获取他的问题他的答案他的cmets......所有这些。哪个用例需要这样的一切?

【讨论】:

  • 傻笑,谢谢!我的意思是,对于任何正在浏览问题的用户,我需要获取问题、答案、问题的喜欢/不喜欢以及每个答案(这些数字可以非规范化)。但是,如果用户已登录,并且对问题/答案进行了投票,我需要在他投票的地方获取他的选票,无论是对问题还是属于该问题的答案。它与 StackOverFlow 并没有什么不同,真的。我希望这是有道理的。
  • 使用我建议的模型,很容易“从postinner join posttype on posttype=vote中选择count(*)”。但我认为这仍然不能回答你的问题。也许解释你想要达到的结果;您想对“问题的答案、喜欢/不喜欢的问题以及每个答案(这些数字可以非规范化)”做什么?
  • 如果我想显示一个问题/答案有多少喜欢/不喜欢/回答,我可以使用帖子表中的额外列并通过回调更新它们。这样就不需要计算连接。但是,如果我是登录用户,并且我查看了一个问题及其答案,我可能想知道我以前是否喜欢/不喜欢这个问题/它的答案。我需要加入 Qs 和 As @userId 的喜欢/不喜欢表。 (有点像 upmod / downmod 这里)。在可扩展性方面,将这些信息放在几个表格(帖子/投票)或一堆表格(问题/答案/问题喜欢/不喜欢)等中更好吗?
  • 我会推荐规范化,直到 A) 你有确凿的证据证明存在性能问题 B) 你已经测试了非规范化为“带有回发的额外列”确实可以改善事情。请记住,通过添加非规范化列获得的假定性能增益将被它将用完的额外内存所抵消。从有效的clean 解决方案开始。以后担心性能。无论如何,当它投入生产时,额外的 CPU 和内存会更便宜>;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多