Как бы я создал эту схему MySQL? - PullRequest
2 голосов
/ 22 ноября 2011

Предположим, у меня есть запись в блоге.

  • имеет много атрибутов
  • К нему прикреплены комментарии.
  • Имеется много состояний (удалено / заблокировано / невидимо и т. Д.).
  • У него много «тегов». (ключевые слова, school_id, user_id)

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

А как насчет "состояний" или "тегов"? Вы бы положили это в другой стол? Или ты вставил бы это во многие столбцы?

А как насчет атрибутов ... если они становятся слишком большими? Потому что по мере роста моего веб-сайта к сообщению блога будет добавляться все больше атрибутов (заголовок, автор, бла, бла ....). Что произойдет, если список атрибутов достигнет 100?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Вот пример:

Опять .. Это просто пример ... Есть и другие подходы, которые вы можете использовать.

Вот так:

-- basic-basic blog
CREATE TABLE blog_entry (
    blog_entry_id INT NOT NULL AUTO_INCREMENT,
    blog_entry_title VARCHAR(255) NOT NULL,
    blog_entry_text VARCHAR(4000) NOT NULL,
    create_date DATETIME,
    state_id INT
);

-- create a look-up table for your blog entry's state
CREATE TABLE be_state (
     state_id INT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (state_id)
);

-- create a look-up table for your blog entry's tag/s
CREATE TABLE be_tag (
     tag_id INT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (tag_id)
);

-- a table to store multiple tags to one entry
CREATE TABLE blog_entry_tags (
    blog_entry_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (blog_entry_id, tag_id)
);

-- a table to store definitions of attributes
CREATE TABLE be_attribute (
    attribute_id INT NOT NULL AUTO_INCREMENT,
    name CHAR(30)
);

-- now have a table to which you can assign multiple attributes to one blog
-- of course, this is if I understand you correctly
-- where you want to have additional attributes
-- aside from the basic properties of a blog entry 
-- and will allow you, if you choose to do it
-- to not necessarily have all attributes for each entry
CREATE TABLE blog_entry_attributes (
    blog_entry_id INT NOT NULL,
    attribute_id INT NOT NULL,
    PRIMARY KEY (blog_entry_id, attribute_id) 
    -- PK enforces one blog entry may have only one attribute of its type
    -- meaning, no multiple attributes of 'location' attribute,
    -- for example, for one blog. Unless of course you wrote half the entry
    -- in one location and finished it in the next.. then you should
    -- NOT enforce this primary key
);
  1. blog_entry - ваша основная таблица, куда идут товары

  2. be_state - задайте их здесь и вставьте их значения state_id в blog_entry.state_id

  3. be_tag - иметь несколько тегов, как мы делаем здесь

  4. blog_entry_tags - поскольку вы можете иметь много тегов для одной записи в блоге,сохраните их здесь и вставьте blog_entry.blog_entry_id и соответствующий be_tag.tag_id вместе.один тег этого типа на запись в блоге.это означает, что вы не можете пометить запись # 1 (например) тегом php дважды или более.

  5. be_attribute - сохраните здесь определения атрибутов, такие как местоположение, автор и т. д.*

  6. blog_entry_attributes - аналогично blog_entry_tags, где вы можете назначить одну или несколько be_attribute для записи в блоге.

Опять же,это только один подход.

1 голос
/ 22 ноября 2011

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

Теги, такие как ключевые слова, не должны храниться в столбцах, поскольку их количество быстро растет со временем.Это не имеет никакого смысла.Для этого создайте таблицу с идентификатором и ключевым словом и таблицу ссылок с post_id и keyword_id.Вы также можете опустить ключевое слово_ключа и напрямую связать пост_ид и ключевое слово.Убедитесь, что оба столбца вместе определяют первичный ключ, поэтому вы не можете получить ключевое слово, сохраненное несколько раз в одном конкретном сообщении.

Для атрибутов оно может быть одинаковым.Не является плохой практикой создание таблицы атрибутов с attribute_id, attribute_name и, возможно, дополнительной информацией, а также таблицей ссылок attribute_id, post_id и content.Вы также можете легко сделать его многоязычным, используя attribute_ids.

Комментарии такие же, они хранятся в отдельной таблице со ссылкой на пользователя и публикацией: comment_id, user_id, post_id, content и, возможно, parent_id,это может быть comment_id, если вы хотите, чтобы комментарии были снова комментируемыми.

Вот и все для краткого обзора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...