2011-01-08 10 views
0

現在のデータベースは、次の表で構成されています。与えられた質問の特定のデータベース設計に関する質問

ストアユーザーの評価 -

user(uid(varchar), qid(varchar), rating(varchar), primary key(uid, qid)) 

店舗質問とそのID -

questions(uid(varchar), question(text), primary key(qid)) 

ストアの質問がお互いの間で持っている関係 -

related(qid(varchar), related_qid(varchar), relation(varchar), primary key(qid, related_qid, relation)) 

各質問は少なくとも1つの他の質問に関連している。例えば、question1とquestion2は、question1の平均格付けがquestion2の格付けよりも大きいと予想されるという点で関連している可能性があります。この関係は、関連するテーブルに

として格納されます。INSERT INTO関連(qid、related_qid、relation)VALUES(1,2、gt)
ここで、「gt」は「より大きい」を意味します。

問題は、関係をエンコードすることはまったく優雅に見えないということです。誰かがより良い解決策を持っていますか?

+0

relation(varchar)とは何ですか?関係の性質がコメントで表現されているのでしょうか?リレーションタイプですか?編集:OK、それはコードまたは略式ルールの参照してください。 – Tim

+0

@Tim、そうです。 – dnbwise

答えて

1

私は列の種類を変更したいと思います。私はqidrelated_qidが高速結合のための整数として最適であり、relatedは、データベースに利用可能であれば(例えば、MySQLがENUM)列挙型に変更できると思います。

PS:テーブルを使用して可能な値を格納し、このテーブルに外部キー制約を設定することによって、列挙型を持たないデータベースの列挙をシミュレートすることもできます。

あなたのユーザーテーブルに2列の主キーがある理由もわかりません。 1つの列で十分であるとは思いますが、アプリケーションの詳細を知らなくても確実なことはありません。

これらの点以外は合理的な設計と思われます。

+0

2列の主キーに関して、私の意図は、同じユーザーと質問に対する複数の評価を防ぐことです。たとえば、uid = 1、qid = 1、rating = 1を挿入すると、uid = 1、qid = 1、rating = 2を挿入できません。それは良いアプローチではありませんか? – dnbwise

+0

@dnbwise:それはOKと聞こえますが、テーブル名の選択に疑問を持っていなければなりません。代わりに 'user_rating'ですか? –

+0

あなたはいくつかの有益な点を作っています。私が持っている問題は、私にとってだと思います。これは、関連するテーブルに潜在的な冗長性があることを意味します。したがって、qid = 1、related_qid = 2、relation = gtと言うことで、qid = 2、related_qid = 1、relation = lt - でも、行のうちの1つだけが必要です。本質的には、私は2つの関係gtとeqだけ必要です。ですから、ENUMが(gt、eq、lt)よりも値(gt、eq)を持つほうが良いでしょうか? – dnbwise

関連する問題