Помогите со схемой БД? - PullRequest
       21

Помогите со схемой БД?

1 голос
/ 17 сентября 2009

Я создаю простое приложение для блога, и пока у меня есть 3 таблицы, Сообщения, Комментарии и Авторы.

Я просто перечислю первичный ключ для каждой таблицы, а также внешний ключ.

Сообщения будут содержать postid в качестве первичного ключа.

Комментарии будут содержать commentid в качестве первичного ключа и postid в качестве внешнего ключа.

Сообщения имеет отношение 0 к многим с комментариями.

Авторы будут содержать authorid в качестве первичного ключа.

Авторы будут иметь много-много отношений с постами и много-много отношений с комментариями.

Последнее утверждение - это то, где у меня больше всего проблем. Имеют ли авторы отношение «многие ко многим» с постами и комментариями, или это один к одному. Если это много ко многим, я слышал, что было бы неплохо иметь промежуточную таблицу, описывающую отношения между постами-авторами и комментариями-авторами, но я не уверен, какие ключи я бы использовал в этой таблице?

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

Ответы [ 7 ]

7 голосов
/ 17 сентября 2009

Я бы подумал, что Авторам постов / комментариев будет отношение «один ко многим», если только вы не планируете поддерживать ситуацию, когда пост может иметь несколько авторов. Может быть, это имеет смысл, но кажется маловероятным, что многие люди использовали бы это. Я бы не стал усложнять мою схему для функции, которая, возможно, понадобится 0,1% моих пользователей.

Просто поместите authorId в таблицу «Посты и комментарии», и все будет хорошо.

4 голосов
/ 17 сентября 2009

Если вы не используете какой-то особенный форум, конечно, правила

  • Автор может написать много сообщений
  • сообщение должно иметь один и только один Автор
  • Автор может написать много комментариев
  • Комментарий должен иметь один-единственный Автор
2 голосов
/ 17 сентября 2009
Если я устно выражаю это как автор, может написать много постов, и много постов может быть написано одним автором, я вижу это как один ко многим, но если я смотрю это из фактических данных, хранящихся в таблицах, таких как посты будет содержать несколько постов, а авторы будут содержать несколько авторов, тогда кажется, что многие для многих, так вот для чего нужна таблица перекрестных ссылок для удаления дубликатов.

Я вижу, где ты запутался. «Таблица сообщений будет содержать несколько сообщений» и «таблица авторов будет содержать несколько авторов» - это правда, но это не то отношение , которое вы пытаетесь выразить. (Это просто природа таблиц - таблица авторов будет иметь много строк, каждая из которых представляет одного автора.)

Главное, для данного поста , сколько у него будет авторов? Один или много? Для данного автора, сколько сообщений он будет иметь? Один или много?

2 голосов
/ 17 сентября 2009

Нет, это просто один ко многим. У поста или комментария может быть только один автор - верно?

Так что вам просто понадобится внешний ключ AuthorID в таблицах постов и комментариев

1 голос
/ 17 сентября 2009

У авторов будет много ко многим отношения с должностями и многими много отношений с комментариями.

То есть вы говорите, что у каждого автора много постов, а у каждого поста много авторов? И то же самое для комментариев?

Если вы делаете вики, хорошо, но в большинстве случаев у данного поста или комментария будет только один автор. Это то, что вы имели в виду?

В любом случае, допустим, существует фактическое отношение «многие ко многим». Например, вы должны создать реляционную таблицу с именем authors_posts, в которой будут следующие столбцы: id, author_id, post_id. Каждая строка указывает, что «автор X и пост Y связаны».

1 голос
/ 17 сентября 2009

Я бы добавил еще один столбец в таблицы «Сообщения» и «Комментарии» для хранения внешнего ключа автора. Обычно посты и комментарии имеют только одного автора.

Итак, ваша схема будет выглядеть так:

Posts
    postid - primary key
    authorid - foreign key
Comments
    commentid - priamry key
    postid - foreign key
    authorid - foreign key
Authors
    authorid - primary key

Authors-comments - one(zero) to many relationship
Authors-posts - one(zero) to many relationship
Posts-comments - one(zero) to many relationship
1 голос
/ 17 сентября 2009

Таблица перекрестных ссылок будет выглядеть примерно так:

create table PostsToAuthors (
    postToAuthorsId int primary key,
    postId int,
    autorId int
);

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

...