2010-11-30 19 views
0

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.

+0

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. –

+0

Weil Fragen und Antworten dieselbe ID haben können, da sie verschiedene Objekte sind. – Mohamad

Antwort

1

Ich würde noch weiter als 2 gehen. Die Frage ist, was sind die Einheiten in Ihrem Modell? Antwort: Benutzer und Beiträge. Ein Beitrag kann eine Frage, eine Antwort, eine Abstimmung, ein Kommentar oder was auch immer sein, aber es ist immer ein Beitrag. So

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

BTW, beide der wählt man erwähnen abrufen alles (oder waren nur sie die schlechteste beitreten zu zeigen?).

ich nicht sehen würde ich seine Fragen holen und seine Antworten und seine Kommentare und ... alle in einem Rutsch. Welchen Anwendungsfall würde das alles erfordern?

+0

Grinsender, danke! Was ich meinte war, dass für jeden Benutzer, der eine Frage durchsucht, ich die Frage bekommen müsste, es sind Antworten, die Vorlieben/Abneigungen der Frage und jeder Antwort (diese Zahlen können denormalisiert werden). Aber wenn ein Benutzer eingeloggt ist und über eine Frage/Antworten abgestimmt hat, muss ich seine Stimmen holen, wo er abgestimmt hat, sei es auf die Frage oder die Antworten, die zu dieser Frage gehören. Es ist StackOverFlow nicht wirklich unähnlich. Ich hoffe das ergibt Sinn. – Mohamad

+1

Mit dem Modell, das ich vorschlage, ist es einfach "wähle count (*) von Posts inner join posttype auf posttype = vote". Aber ich denke, das beantwortet deine Frage immer noch nicht. Erklären Sie vielleicht das Ergebnis, das Sie erreichen möchten; Was willst du mit "den Antworten, den Vorlieben/Abneigungen der Frage und jeder Antwort (diese Zahlen können denormalisiert werden?") machen? – smirkingman

+0

Wenn ich zeigen möchte, wie viele Likes/Abneigungen/Antworten eine Frage/Antwort hat, Ich kann zusätzliche Spalten in der Posts-Tabelle verwenden und sie über Callbacks aktualisieren.Auf diese Weise sind keine Joins zum Zählen nötig. Aber wenn ich ein eingeloggter Benutzer bin und ich eine Frage und ihre Antworten sehe, möchte ich vielleicht wissen, ob ich diese Frage/ihre Antworten vorher gemocht/nicht gemocht habe. Ich muss den Likes/Dislikes-Tabellen für Qs und As @userId beitreten. (so wie upmod/downmod hier). In Bezug auf Skalierbarkeit, ist es besser, diese Informationen in ein paar Tabellen (Beiträge/Stimmen) oder eine Reihe von Tabellen (Fragen/Antworten/Frage likes/dislikes) usw. – Mohamad

Verwandte Themen