1

私はデータベースは初めてですが、いくつかのチュートリアルを読み、基本的なことのほとんどを学びました (私は長い間プログラマーです)。ただし、リレーショナル データベースの制限を回避するための助けが必要です。写真がある場合は、そのための簡単なテーブルを作成できます

"CREATE TABLE picture(
file VARCHAR(150),
rating INT
)";

誰が写真を評価したかを追跡したい場合は、事前に設定された有権者数をそのようにハードコードすることができます (この例では 3 つの匿名投票)。

"CREATE TABLE picture(
file VARCHAR(150),
rating INT,
vote1 INT,
vote2 INT,
vote3 INT
)";

または、無制限の数の場合、新しいテーブルをそのまま作成できます

"CREATE TABLE ratingTemplate
(
rater INT,
rating INT
)";

しかし、画像テーブルのすべての画像エントリに対して、この ratingTemplate テーブル全体への参照が必要です。これを達成するために外部キーを使用する適切な方法はありますか? 現在、新しい ratingTemplate テーブルを作成し、それらの名前を対応する画像テーブルのエントリに保存することで、それを細かく管理しています。

4

2 に答える 2

2

はい、picture テーブルと user テーブルへの参照を保持するテーブルが必要です。

CREATE TABLE IF NOT EXISTS PICTURE (
    PICTURE_ID  BIGINT NOT NULL AUTO_INCREMENT,
    FILE            VARCHAR(250),
    PRIMARY KEY (PICTURE_ID)
);

CREATE TABLE IF NOT EXISTS USER (
    USER_ID     BIGINT NOT NULL AUTO_INCREMENT,
    --....REST OF COLUMNS HERE...

    PRIMARY KEY(USER_ID)
);

CREATE TABLE IF NOT EXISTS PICTURE_RATING (
    RATING_ID       BIGINT NOT NULL AUTO_INCREMENT,
    PICTURE_ID  BIGINT NOT NULL,
    USER_ID     BIGINT NOT NULL,
    RATING      DOUBLE,

    PRIMARY KEY (RATING_ID),
    FOREIGN KEY (PICTURE_ID) REFERENCES PICTURE(PICTURE_ID),
    FOREIGN KEY (USER_ID) REFERENCES USER(USER_ID)
);
于 2011-03-19T14:12:25.410 に答える
0

「picture」テーブルの主キーを特定していませんが、提示されているように、主キーは「file」列のように見えます。「file」という名前の「ratingTemplate」テーブルに列を追加する必要があります。これは varchar(150 になります。「ratingTemplate」の主キーは「file」と「rater」の組み合わせになります。「file」 'ratingTemplate' テーブルの列は、'picture' テーブルの 'file' 列への外部キーになります。

サンプルクエリ:

SELECT  picture.file, rater, rating
FROM    picture INNER JOIN ratingTemplate ON picture.file = ratingTemplate.file
WHERE   picture.file = 'filenameiwant'

もう 1 つの方法は、'picture' テーブルに代理主キーを追加することです。おそらく、整数として「FileId」という名前が付けられます。その場合、「ファイル」の代わりに「ratingTemplate」の「FileId」列を外部キーとして使用します。大規模なデータセットの場合、これはより高速に実行され、使用するスペースが少なくなります。

サンプルクエリ:

FROM    picture INNER JOIN ratingTemplate ON picture.FileId = ratingTemplate.FileId
WHERE   picture.FileId = 257
于 2011-03-19T14:22:08.540 に答える