0

私はWebアプリを開発していますが、データベース情報を整理する方法についてアドバイスが必要です。以下は、アプリが持つすべての情報のリストです。

1)次のようなテーブルに格納されるユーザーが存在します。

User
 - username (primary key)
 - email

2)ユーザーはマップを作成できます(このようなテーブルで表されます)

Map
 - name
 - data

ユーザーは多くの地図を作成できます

mySQLデータベースを使用して、上記のようなストレージシステムを実現するにはどうすればよいですか。

  • すべてのユーザーのマップを格納する1つのテーブルが必要ですか?次に、マップテーブルに新しい「username」フィールドを作成します。
  • そのユーザーのマップのみを格納する新しいユーザーごとに新しいマップテーブルを作成する必要があります。
  • ユーザーに新しい「マップ」フィールドを作成し、それをマップテーブルにリンクする必要がありますか?

最終的には、各ユーザーが自分のマップのコレクションにのみアクセスして表示できるようにします。私はmySQLとデータベース設計に不慣れなので、これに関するアドバイスをいただければ幸いです。

4

3 に答える 3

1

ユーザーが多くのマップを作成できるとおっしゃっていたので、これには2つのテーブルしか必要ないと思います(すべてのユーザーに多くのマップテーブルは必要ありません) 。

ユーザー

  • userID(主キー
  • userName(一意
  • Eメール

地図

  • ID(主キー
  • 名前
  • 日にち
  • userID(外部キー

DDLに変換された場合:

CREATE TABLE User
(
    UserID INT AUTO_INCREMENT,
    UserName VARCHAR(15),
    Email VARCHAR(35),
    CONSTRAINT usr_pk PRIMARY KEY(UserID),
    CONSTRAINT usr_uq UNIQUE(UserName)
);

CREATE TABLE Maps
(
    MapID INT AUTO_INCREMENT,
    Name VARCHAR(20),
    Date DATETIME,
    UserID INT,
    CONSTRAINT map_pk PRIMARY KEY(MapID),
    CONSTRAINT map_FK FOREIGN KEY(UserID) REFERENCES User(UserID)
);

すべてのユーザーのすべてのマップを取得する場合は、

SELECT  a.*, b.Name
FROM    User a
        INNER JOIN Maps b
            ON a.UserID = b.UserID

結合についてさらに知識を深めるには、以下のリンクにアクセスしてください。

于 2013-03-09T17:16:37.727 に答える
1

マップのユーザーごとに新しいテーブルを作成しないでください。これを維持するのは悪夢であり、正規化を制御できなくなります。同様のコメントがポイント#3(maps各ユーザーマップの新しい列)にも当てはまります。

最初のポイントを実行します。マップにユーザー名列を追加します。次に、マップ用に1つのテーブルを作成し、ユーザーごとに必要な数のマップを作成できます。さらに一歩進んでauto_increment、マップにリンクする「ユーザーID」列を追加します(ユーザー名は結局変更される可能性がありますが、それでも一意である必要があります)。マップには、独自のauto_increment識別子列も必要です。これは「代理キー」と呼ばれます。

SELECT data FROM Map JOIN User USING(userID) WHERE userID = ?
于 2013-03-09T17:17:08.303 に答える
0

私がこれまでに得た最高のデータベース設計の1つは、名詞ごとに(そして単数で)テーブルを作成することでした。たとえば、ユーザーについて話しているとします。これは、ユーザーテーブルがあることを意味します。次に、作成されたすべてのマップを一覧表示するマップテーブルがあります。

次に、ユーザー間の関係についてマップについて話しているので、そのテーブルをUserMapRelationshipまたは単にUsersMapと呼ぶことができます。

これは、両方のテーブルのpkと、おそらくその関係に関連する情報を保持します。

これがお役に立てば幸いです。

ありがとう!

@leo。

于 2013-03-09T17:19:04.750 に答える