Лучший способ создать таблицу, в которой ячейка имеет несколько ссылок? - PullRequest
0 голосов
/ 28 августа 2011

Мой вопрос касается того, как проектировать базу данных.

У меня есть одна таблица, называемая сообщениями, со столбцами:

ID, subject, keywords, (and a few other columns)

и еще одна таблица с ключевыми словами:

kw_id, keyword.

Теперь у каждого "сообщения" есть несколько ключевых слов, а иногда и ключевые слова удаляются, потому что они не имеют смысла или являются дубликатами.

Мой вопрос:

  • Может ли ключевые слова столбец в таблице сообщений быть внешним ключом? (в каждой строке будет несколько ключевых слов)

  • Если я не могу, как лучше всего обеспечить целостность данных (особенно при удалении ключевого слова)?

заранее спасибо

РЕДАКТИРОВАТЬ: Можете ли вы указать мне какие-либо книги или документы, которые я должен прочитать о дизайне базы данных? Кажется, я теряю ключевые знания о дизайне баз данных.

Ответы [ 4 ]

6 голосов
/ 28 августа 2011

Вы должны перевернуть зависимости: Таблица KEYWORD должна ссылаться обратно на публикацию. Вы можете захотеть что-то среднее, чтобы найти все сообщения по заданному ключевому слову (псевдокод):

POST
    POST_ID
    ...

KEYWORD
    KEYWORD_ID
    NAME        /* the keyword */

POSTKEYWORDREL    /* relationship */
    POST_ID     /* foreign key to POST */
    KEYWORD_ID  /* foreign key to KEYWORD */

Теперь вы можете легко удалить ключевое слово из данного поста, просто удалив связь в POSTKEYWORDREL.

РЕДАКТИРОВАТЬ: Как всегда, для документации позвольте мне указать вам Википедия . Вам также следует взглянуть на нормализацию (на мой взгляд, самая важная концепция, когда речь идет о проектировании баз данных).

2 голосов
/ 28 августа 2011

Вам нужна таблица много-много в "середине" с внешними ключами

Сообщений:

ID (PK)
Subject
(and a few other columns)

Ключевые слова:

kw_id (PK)
Keyword (UQ)

PostsKeywords

PostID (PK, FK to Posts.ID)
kw_id (PK, FK to Keywords.kw_id)

Почему существуют разные соглашения для ваших столбцов "ID"?Лично я бы использовал PostID и KeywordID везде.

Редактировать: ссылка на дизайн базы данных

1 голос
/ 28 августа 2011

Вместо размещения столбца ключевое слово в таблице post вам понадобится отдельная таблица post_keyword с двумя столбцами: post_id и keyword_id .Наличие строки в этой таблице указывает на то, что конкретной записи было присвоено определенное ключевое слово .Первичный ключ этой таблицы ( post_id , keyword_id ).Оба столбца являются внешними ключами своих основных таблиц.

Это стандартная практика проектирования для отношений «многие ко многим».

Если ваши ключевые слова элементы должны быть представлены в определенном порядке, добавьте столбец order .

Кстати, для достижения наилучших результатов,Назовите столбец идентификатора post_id в вашей таблице post и во всех других таблицах, в которых он появляется.Таким образом, различные инструменты разработки схем смогут понять, что вы делаете.

1 голос
/ 28 августа 2011

, чтобы следовать вашему дизайну, в таблице сообщений вы удаляете ключевые слова столбца.

затем вы создаете другую таблицу, чтобы установить отношение многие ко многим, что-то вроде

PostKeywords

эта таблица будет содержать как минимум post_Id и kw_id, и оба являются внешними ключами для своих таблиц.

лично в этих случаях я также создаю локальный столбец PK, который не участвует во многих для многих,например, PostKeywords_ID, который является автоинкрементом, локальным только для этой таблицы.

...