7

私はテーブル users を持っています:

user_id - name

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

article_id - user_id - article_name

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

share_id - article_id - user_id

これにより、その記事へのアクセス権を持つすべてのユーザーが一覧表示され、作成者は作成した記事のテーブルから追加または削除できるアクセス権を持つことになります。

したがって、記事の作成者 (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'

これは論理的に思えますか?私は正しい軌道に乗っていますか?

助けてくれてありがとう

4

1 に答える 1

1

あなたはそれを正しく持っています。興味があれば、との間の多対多の関係を作成するためのジャンクションテーブルを作成しまし。これはかなり標準的なことです。usersarticles

これらのタイプのテーブルには、「のようなArticlesToUsers」または「類似したもの」という名前が付けられていることがよくあります。これが、ジャンクションテーブルを見ていることを示す最初の方法になる場合があります。もちろん、命名スキームはかなり主観的なものなので、名前を変更する必要性を感じないでください。 article_shares私には良い説明のようです。

@MaxVTが示しているように、多くの開発者はこのようなジャンクションテーブルに代理キーを配置せず、両方の列を主キー(article_id、user_id)として使用するだけであることがわかります。選択は明らかにあなた次第であり、他のデータベーステーブルとの一貫性を保つことに関係している可能性がありますが、実際にはすべての順列が確実に表示されます。代理キーを保持する場合は、重複を排除するためにとにかく一意の制約をお勧めしますarticle_id, user_id(なぜ、記事をユーザーに2回共有する必要があるのでしょうか?)。

于 2012-10-10T18:10:23.573 に答える