2012-10-10 5 views
7

私はテーブルのユーザーがあります。表のデザインのアドバイス

user_id - name 

をそしてそれらのユーザーが記事を作成し、他のメンバーと共有することができ、テーブルの記事:

article_id - user_id - article_name 

質問が最良の方法ですそれを共有する...私は別のテーブルを考えている:

share_id - article_id - user_id 

これは、 aerticleと作成者は、作成した記事のテーブルに追加または削除できるアクセス権を持っています

したがって、記事作成者(user_id 123)が記事を見ると、彼は他のすべてのユーザーのリストを見ることができます

select as.user_id, a.article_name from article_shares as 
join users u on u.user_id = as.user_id 
join articles a on a.article_id = as.article_id where u.user_id = '123' 

で各記事を共有しており、利用者(USER_ID 456)は、彼らが

select a.article_name from articles a 
join article_shares as on as.article_id = a.article_id 
where as.user_id = '456' 

を共有してきた記事の一覧を見ることができ、これは論理的に見えるのか?正しい軌道にいるのですか?

ありがとうございました

+3

私にはうまく見えます。共有記事を見ることができるユーザーに共有記事を関連付けるには何らかの方法が必要です。もっと簡単な方法は考えられません。 – Jay

+0

@Jayありがとう、ちょうど2日前にジョイントについて教えてくれたので、時間をかけて見てくれてありがとう! –

+0

あなたは正しい道を歩いています。 JOINを使用して快適になったら、それはすべてフォーム(INNER、LEFTなど)で行うことができません。 :) –

答えて

1

あなたはそれが正しいです。興味があれば、junction tableを作成してusersarticlesの多対多の関係を作成しました。これはかなり標準的です。

ArticlesToUsersなどの名前のこれらのタイプのテーブルがよく見られますが、これは接合テーブルを見ている最初の方法であることがあります。もちろん、名前付けスキームはかなり主観的なので、名前を変更する必要性を感じないでください。 article_sharesは私にとっては良い説明のようです。

@ MaxVTが示しているように、多くの開発者がこのようなジャンクションテーブルにsurrogate keyを置くことはなく、両方のカラムをプライマリキー(article_id、user_id)として使用することになります。選択肢は明らかにあなたのものであり、データベーステーブルの他の部分との一貫性を保つことともっと関連しているかもしれませんが、野生のすべての順列を確かに見ることができます。代理キーを保持している場合は、重複を排除するために、一意の制約article_id, user_idをお勧めします(なぜ、記事をユーザーに2回共有する必要がありますか)。

+0

ありがとうTim、そのアドバイスを感謝してください! –

関連する問題