2

私は今ウェブアプリを作っています、そして私はデータベース設計に頭を悩ませようとしています。

ユーザーモデル(ユーザー名(主キー)、パスワード、電子メール、Webサイト)がありますエントリモデル(ID、タイトル、コンテンツ、コメント、commentCount)があります

ユーザーは、エントリに1回だけコメントできます。これを行うための最良かつ最も効率的な方法は何ですか?

現在、ユーザー名(ユーザーモデルから)とエントリID(エントリモデルから)を持つ別のテーブルを考えています。

   **username    id**
    Sonic        4
    Sonic        5
    Knuckles     2
    Sonic        6
    Amy          15
    Sonic        20
    Knuckles     5
    Amy          4

したがって、エントリ4のコメントを一覧表示するには、id=4を検索します。

補足: commentCountを保存する代わりに、必要なときに毎回データベースからコメント数を計算する方がよいでしょうか?

4

6 に答える 6

2

正確にはどういう意味ですか

entry model(id, title, content, **comments**, commentCount)

(私の強調)?エンティティごとに複数のコメントがあるように見えるため、それらは別のテーブルに保存する必要があります。

comments(id, entry_id, content, user_id)

entry_idおよびuser_idは、それぞれのテーブルへの外部キーです。entry_idここで、( 、 )に一意のインデックスを作成して、user_idユーザーがエンティティごとに1つのコメントしか追加できないようにする必要があります。

また、ユーザー名をPKにする代わりに、usersテーブルの代理(数値、シーケンス/ IDを介して生成)主キーを作成することもできます。

于 2009-09-10T22:42:27.770 に答える
2
  1. ユーザー名をプライマリIDとして使用しません。自動インクリメントで数値IDを作成します
  2. リレーションテーブルでその新しいIDを使用し、2つのフィールドに一意のキーを設定します
于 2009-09-10T22:43:09.357 に答える
2

あなたのデザインは基本的に健全です。3番目のテーブルには、UsersEntriesCommentsのような名前を付け、フィールドUserName、EntryID、Commentを付ける必要があります。このテーブルには、UserNameフィールドとEntryIDフィールドで構成される複合主キーがあります。これにより、各ユーザーが各エントリに1回だけコメントできるというルールが適用されます。このテーブルには、UserNameがUsersテーブルにあり、EntryIDがEntriesテーブル(具体的にはIDフィールド)にある必要があるなどの外部キー制約もあります。

IDフィールドをUsersテーブルに追加することもできますが、多くのプログラマー(私自身を含む)は、可能な場合は「自然」キーの使用を推奨しています。UserNamesはシステム内で一意である必要があるため、これは完全に有効な(そして簡単に読み取れる)主キーです。

更新:質問をもう一度読んでください。エントリテーブルのCommentsまたはCommentsCountフィールドは必要ありません。コメントはUsersEntriesCommentsテーブルに適切に保存され、カウントはクエリで動的に計算されます(この値を自分で更新する手間を省くことができます)。

アップデート2:James Blackは、 UserNameを主キーとして使用せず、代わりに人工的な主キー(UserIDなど)をテーブルに追加することを支持しています。UserNameを主キーとして使用する場合、関連するすべてのテーブルでもユーザー名を変更する必要があるため、ユーザーがユーザー名を変更できるようにすることはより困難です。

于 2009-09-10T22:49:19.983 に答える
2

データモデルに関する私の推奨事項は次のとおりです。

USERSテーブル

  • USER_ID(pk、int)
  • USER_NAME
  • パスワード
  • Eメール
  • WEBサイト

ENTRYテーブル

  • ENTRY_ID(pk、int)
  • ENTRY_TITLE
  • コンテンツ

ENTRY_COMMENTSテーブル

  • ENTRY_ID(pk、fk)
  • USER_ID(pk、fk)
  • コメント

この設定により、ENTRYは0以上のコメントを持つことができます。コメントが追加されると、主キーはの複合キーでENTRY_IDありUSER_ID、ペアがテーブルに1回だけ存在できることを意味します(つまり、1、1では1、1を再度追加することはできません)。

カウントをテーブルに格納しないでください。そのためにVIEWを使用して、実行時の既存のデータに基づいて数値を生成できるようにします。

于 2009-09-11T00:55:37.680 に答える
1

問題ではありませんが、主キーであるユーザーIDが必要な場合があります。そうしないと、ユーザーがユーザー名の変更を許可されているか、特定のユーザーにユーザー名を変更できないことを知らせることが困難になります。

結合されたテーブルにuseridとentryidに対する一意の制約を持たせます。このように、データベースはコメント/エントリ/ユーザーが1つだけであることを強制します。

ところで、データベースを指定した場合に役立ちます。

于 2009-09-10T22:42:37.347 に答える
0

コメントのセットがXに関して 一意であることを保証したいようです。これを行うには、一意の制約を使用するか、データベースシステムがそれを明示的にサポートしていない場合は、同じことを行うインデックスを使用します。これを表すSQLは次のとおりです。usernamepost_id

CREATE TABLE users (
    username VARCHAR(10) PRIMARY KEY,
    -- any other data ...
);

CREATE TABLE posts (
    post_id INTEGER PRIMARY KEY,
    -- any other data ...
);

CREATE TABLE comments (
    username VARCHAR(10) REFERENCES users(username),
    post_id INTEGER REFERENCES posts(post_id),
    -- any other data ...
    UNIQUE (username, post_id) -- Here's the important bit!
);
于 2009-09-10T23:14:24.690 に答える