Ich spiele mit zwei Schemas und ich kann nicht entscheiden, welche besser skalierbar ist. Das Schema ist für ein Q & A und es ist in MySQL gebaut. Leute stellen Fragen/Antworten und mögen/mögen/favorisieren Fragen und Antworten. Eine Frage kann viele Antworten/Vorlieben/Abneigungen haben, und so kann eine Antwort geben.Welches dieser beiden Schemas ist besser skalierbar?
Um eine Frage an einen Benutzer beider Schemata erfordern die gleiche Anzahl von Verknüpfungen, zu lesen, aber die werden unterschiedlich behandelt Joins:
Schema 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)
Das ist mehr normalisiert, einfacher zu entwickeln für, aber skalierbar? Scheint eine Menge Wiederholungsinformationen zu sein. Die Sequenz beitreten eine Frage zu greifen ist für einen Benutzer (wir wollen seine wie/Abneigung Aktivität einschließen)
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)
Schema 2
posts(id, postTypeId, userId, title, body)
postTypeId(id, postType)
comments(id, postId, userId)
votes(id, voteTypeId, userId)
voteTypeId(id, voteType)
Dies ist weniger normalisiert und kompakt, wie es scheint würde besser skalieren, ein Nackenschmerz mit Selbstbeteiligung und anderen Entwicklungsproblemen (bedingte Validierung). Die Join-Sequenz eine Frage zu greifen ist
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)
Also, was besser skaliert? Ich weiß, kann zusätzliche Felder hinzufügen, um zählt zu speichern, so dass keine Joins notwendig sind. Aber beide erfordern die gleiche Anzahl von Joins und ich kann mich nicht entscheiden.
Ich habe deine Frage nicht sehr weit gelesen, aber warum hast du zwei verschiedene Tabellen für questionLikes und questionDislikes ??? und ich denke, die gleiche Bemerkung kann weiter auf Ihr Schema angewendet werden. –
Weil Fragen und Antworten dieselbe ID haben können, da sie verschiedene Objekte sind. – Mohamad