0

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

ユーザー

id| login| user_type

----------

1 | John | normal_user
2 | Kate | cool_user
3 | Brian | cool_user

ここで、特定のタイプのユーザー (cool_user) に割り当てることができるコードがあるとします。原則として、次のように既存のテーブルに列を追加することをお勧めします。

Users(id, login, user_type, cool_user_code)

これにより、データの取得が非常に簡単になります。しかし、コードを別のテーブルに入れ、1 対 1 の関係にする方がよいのではないでしょうか?

Users(id, login, user_type)
Cool_User_codes(id, user_id, code)

どちらのソリューションが優れているか、またその理由は?

4

3 に答える 3

3

これは漠然とした質問であり、データをどのように使用するかによって異なります。現実的には、Users テーブルである確実なテーブルが 1 つあります。

「cool_user_code」はすべてのユーザーに必要なわけではないため、Users テーブルと 1:1 の関係で存在する「user_id」を主キーとする別のテーブルとして持つことが望ましいでしょう。

しかし、これはもちろん他の要因に依存します。代わりに、後で必要に応じて他のタイプで使用するために、Users テーブルに追加の「additional_user_code」列を作成することもできます。次に、ユーザーが「クール」ではなくなった場合、cool_user_code はどうなるかという問題があります。

要するに、あなたの質問は漠然としていて具体的な答えを得ることができません。

これを行う方法の例の表

CREATE TABLE users(
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    userLogin VARCHAR(255) NOT NULL,
    userType ENUM('normal_user','cool_user'),
    PRIMARY(userID)
);

CREATE TABLE userAdditionalData(
    userID INT UNSIGNED NOT NULL,
    userAdditionalData TEXT NOT NULL,
    PRIMARY(userID)
)

... また ...

CREATE TABLE users(
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    userLogin VARCHAR(255) NOT NULL,
    userType ENUM('normal_user','cool_user'),
    userAdditionalData TEXT DEFAULT NULL,
    PRIMARY(userID)
);

(必要に応じて、「VARCHAR」、「BLOB」、または「INT」などを「TEXT」に置き換えます)

于 2013-06-10T22:23:37.823 に答える
1

論理的には、親の「クラス」(通常のユーザー) と、そこから継承された子の「クラス」(クールなユーザー) があります。物理的には、リレーショナル データベースで継承を実装するには 3 つの方法があります。

  1. 階層全体ごとのテーブル。
  2. 非抽象クラスごとのテーブル。
  3. クラスごとのテーブル。

あなたの場合、継承階層は非常に単純で、子に追加フィールドが 1 つしかないため、最初のアプローチをお勧めします (つまり、すべてを 1 つのテーブルに入れ、余分なフィールドを NULL 可能にします)。を削除してuser_type、余​​分なフィールドが NULL であるかどうかに基づいてユーザー タイプを識別することもできます (後でユーザー タイプを追加しないと仮定します)。

于 2013-06-10T23:07:24.073 に答える
-1

これは、cool_user_code がすべての cool_user で同じかどうかによって異なります。同じなら絶対に別の表に入れるべきです。そうでない場合は、大したことではなく、両方のソリューションで問題ありませんが、そうしない理由がないため、最初のテーブルに保持します。

于 2013-06-10T22:23:23.917 に答える