внешний ключ mysql для всей таблицы - PullRequest
0 голосов
/ 19 марта 2011

Я новичок в базах данных, но я просмотрел некоторые учебные пособия и изучил большинство основ (я давно программист). Однако мне нужна помощь, чтобы обойти ограничения реляционных баз данных. Если у меня есть картинка, я могу создать для нее простую таблицу

"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 и сохраняя их имена в соответствующей записи таблицы рисунков.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Да, у вас должна быть таблица, в которой хранятся ссылки на таблицу изображений, а также на таблицу пользователей.

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)
);
0 голосов
/ 19 марта 2011

Вы не определили первичный ключ для таблицы 'picture', но в представленном виде первичный ключ будет выглядеть как столбец 'file'. Вам необходимо добавить столбец в таблицу «ratingTemplate» с именем «file», который также будет varchar (150. Ваш первичный ключ в «ratingTemplate» будет представлять собой комбинацию «file» и «rater». Файл «file» Столбец 'в таблице' ratingTemplate 'будет первым ключом к столбцу' file 'в таблице' picture '.

Пример запроса:

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

Другой подход заключается в добавлении суррогатного первичного ключа в таблицу 'picture'. Возможно, названный FileId как целое число. В этом случае вы бы использовали столбец «FileId» в «ratingTemplate» в качестве внешнего ключа вместо «file». Для больших наборов данных это будет выполняться быстрее и будет занимать меньше места.

Пример запроса:

FROM    picture INNER JOIN ratingTemplate ON picture.FileId = ratingTemplate.FileId
WHERE   picture.FileId = 257
...