2

私は独自のフィードバック アプリケーションに取り組んでいます。提案、質問、および問題を保存するために使用するトピックという名前のテーブルがあります。

topics [ id, user_id, title, content, type[suggestion, question, problem] ]

type3 つの異なるトピック タイプを区別する列を使用して、このデータを 1 つのテーブルに簡単に格納できます。

ただし、別の問題があります。各トピックにも独自の応答があり、応答はトピック自体に非常に似ています。それらも同じテーブルに保存したくなります。だから今私はtype (suggestion, question, problem)とを持っていsubtype (topic, response)ます。

トピック テーブルに質問しすぎていませんか? データを別々のテーブルに分割する必要がありますか? この特定のプロジェクトには Postgres と Rails を使用しています。

視覚化する最善の方法は、それを StackoverFlow と比較することです。SO は質問と回答を同じpostsテーブルに格納します。ここで、質問だけではなく、SO が提案と問題を許可することにしたとします。彼らはまだ同じテーブルを使用しますか?

4

3 に答える 3

3

1 回のアクションでトピックと回答の両方をクエリする頻度は? 検索時かもしれませんが、トピックのみ、または回答のみを検索したい場合もあります。また、そのうちの 1 つだけを照会する必要がある頻度はどれくらいですか? ほとんどの時間。

2 つの別々のテーブルUNIONを使用してください。それらを一緒に使用する場合は、句付きのビューを使用できます。また、アプリケーション レベルでは、リレーショナル データベースの上に継承モデルを構築できます。PostオブジェクトTopicResponseサブクラスを言います。などの一部のライブラリは、*all posts that...` のクエリを 2 つの個別のクエリに透過的に変換し、結果を結合します。

もう 1 つのアプローチ(リレーショナル ストアで継承を処理する方法の 1 つでもあります) は、3 つのテーブルを持つことです。PostsTopicsおよびResponseへの外部キーを持つ最後の 2 つPosts。このように、共通の列は 1 つのテーブルにあり、型固有の列は個別に存在します。

于 2012-08-28T17:29:09.783 に答える
1

トピックと回答を 1 つのテーブルに保持することは、フォーラムに適しています。(多くは、計画している機能によって異なります。それはフォーラムですか、それともニュース/記事/レビュー サイトですか?)

ほとんどのフォーラム フレームワークは、この設計を使用します。あなたが言及したようにSOを含みます。明確にするべき 1 つの違い - 「トピック」として定義しているものは一般に「投稿」であることに注意してください。したがって、「応答」も投稿です。他のフレームワークが「トピック」と呼ぶものは、スレッド情報です。

次のようなものを使用して、投稿 + 応答をクエリできます。

select t.id, t.user_id, t.title, t.content, t.type, t.parent_id,
       r.id, r.user_id, r.title, r.content, r.type, r.parent_id
from topics t
left join topics r on r.parent_id = t.id
where t.parent_id = 0 and t.id = <specific id>

分離する必要がある部分は次のとおりです。スタックオーバーフローの質問/アクティブ/最新ページのようなスレッドの概要を表示する場合。または、最新のトピック、応答、ポスターなどを含むフォーラム インデックス。thread_infoテーブルを維持すると、データベースのパフォーマンスに役立ちます。特に、ビジターのボリュームが大きい、および/または多くのスレッドや投稿が予想される場合に役立ちます。

ここで、質問だけではなく、SO が提案と問題を許可することにしたとします。彼らはまだ同じテーブルを使用しますか?

それSuggestionsは依存します。commentsたとえば を見てください。別のテーブル。コメントの性質 (モデル) + 機能は、別々に保存できるほど異なります。

別の例を挙げると、ニュース/レビュー サイトやワードプレスのようなものでは、記事とその応答は同じ理由で別々に保存されます。記事には、サイトの作成者、関連する記事、フォーマット、カテゴリなどとの関係があります。応答はスレッド化され、フォーマットされていない可能性もあります。

于 2012-08-28T21:38:17.650 に答える
0

ここでは複数の表を使用してください。ご自身でおっしゃいましたが、別の問題があります: 各トピックには独自の応答があります* es *

倍数には、通常、別のテーブルが必要です。

[TOPICS] [topicID, user_id, title, content, type[提案, 質問, 問題] ]

[SUGGESTION] [ suggID     <fields here>        *topicID ]

topicIDの外部キーとして注意してください[SUGGESTION]

于 2012-08-28T17:31:06.003 に答える