2017-10-21 9 views
-1

私はこれがこれらの疑問の1つであると考えていますが、それは単一の決定的な回答ではありません。しかし、私は、一般的にベストプラクティスと考えられるものを、ほとんどの場合はとにかく考えていることについて、いくつかの洞察を得ることを望んでいます。だから、これに重点を置く人々に事前に感謝します。このデータを表現するためのより良いスキーマは何でしょうか?

レコードを格納するための2つのタイプのフォルダがあります。個人用フォルダとチームフォルダ。

私はデータベースでこれを表すことができます二つの方法...

オプション1があります:2つの独立した無関係のフォルダテーブルが。

personalFolders(id, userId, title) 
teamFolders(id, teamId, title) 
records(id, folderId, folderType, title) 

オプション2:2と共通のフォルダテーブルにはテーブルを結合

folders(id, title) 
personalFolders(folderId->folders.id, userId) 
teamFolders(folderId->folders.id, teamId) 
records(id, folderId->folders.id, title) 

私の質問をされています。一般的に、どのようなスキーマがベストプラクティスと考えられるでしょうか?

(その後、私はレコードをテーブルに外部キー制約を保つことができるので、私の腸は、オプション2に行くために私に言っている。しかし、オプション1で行く方が良いかもしれない状況があるのですか?)

+0

個人用フォルダとチームフォルダのタイトルは同じですか?もっと一般的な質問は、フォルダやフォルダの種類ごとに自然なキーは何ですか? –

+0

@rd_nielson - はい、同じタイトルを持つことができます。 IDが主キーです。 – trav

+0

オプション2では、タイトルにユニークなインデックスを作成し、同じタイトルを持つ個人用フォルダとチームフォルダの両方に同じIDを使用させるか、同じタイトルの2つの異なるIDを使用できますか?後者の場合、個人用フォルダとチームフォルダが両方とも同じIDを参照しないようにトリガを作成する予定ですか?関連して、タイトル以外の個人またはチームのフォルダには他の属性がありますか? –

答えて

0

私は実際にユーザーIDとteamId両方の列が含まれているフォルダのための一つのテーブルになるだろう:

folders (id, title, userId, teamId) 
records (id, folder.id, title) 

あなたはuserIdteamId列がNULLであれば、フォルダがチェックすることによって、個人用フォルダまたはチームフォルダであるかどうかを判断することができますまたは値を持ちます。

これは、同じフォルダを2つのテーブルに保存する必要なく、フォルダを個人フォルダとチームフォルダの両方にすることができるという利点があります。レコードテーブルにFK制約を設定することもできます。これにより、結合や結合なしですべてのフォルダ(個人とチームの両方)を簡単に選択できます。

これはオプション2と基本的に同じですが、余分な結合テーブルを不要にすることで簡単にできます。

私は個人的には、選択肢1の利点はありません。あなたがばかげた量のデータを持っていて、別のテーブルに分割してパフォーマンスを向上させることができない場合を除きます。

+0

フォルダを複数のユーザーまたは複数のチームに所属させることができたら、これはうまくいかず、オプション2を使用したいと思うはずです。単一のチームであれば、複雑なジョイン・テーブルを追加する必要はありません。 – patrick3853

+0

答えをありがとう、これは私が提供した例を見て良い意味があります。 実際にはフォルダは複数の人に属しているかもしれませんので、オプション2と結合を使用すると思います。 – trav

+0

ええ、user/teamがフォルダとの関係が多対1の場合、データを正規化してフォルダレコードが重複しないようにするために、結合テーブルが唯一のオプションです。 – patrick3853

関連する問題