我该如何创建这个MySQL Schema?

时间:2011-11-22 19:30:28

标签: mysql database schema

假设我有一个博客帖子实体。

  • 它有很多属性
  • 附有评论。
  • 它有许多状态(删除/锁定/不可见等)。
  • 它有很多“标签”。 (keywords,school_id,user_id)

显然,评论应该是自己的表,与Blog表有多对一的关系。

但是“状态”或“标签”呢?你会把它放在另一张桌子上吗?或者你会坚持多列?

属性怎么样......如果它们太大了?因为随着我的网站的增长,博客文章将附加越来越多的属性(标题,作者,等等,等等......)。如果属性列表高达100,会发生什么?

2 个答案:

答案 0 :(得分:2)

以下是一个示例:

再次......这只是一个样本..还有其他方法可以使用。

我们走了:

-- 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

  3. 中插入blog_entry.state_id个值
  4. be_tag - 有多个标签,就像我们在这里做的那样

  5. blog_entry_tags - 由于您可能为一个博客条目设置了许多标签,因此请将其存储在此处并将blog_entry.blog_entry_id和相应的be_tag.tag_id一起插入。每个博客条目的类型的一个标记。这意味着您无法将条目#1(例如)标记为php两次或更多。

  6. be_attribute - 在此处存储属性定义,例如位置,作者等

  7. blog_entry_attributes - 类似于blog_entry_tags,您可以在其中为博客条目分配一个或多个be_attribute

  8. 同样,这只是一种方法。

答案 1 :(得分:1)

首先,状态应该是一个结构紧凑的东西,所以你应该为它们创建单独的列。考虑一下您需要的内容,但稍后可以轻松添加一两列。

像关键字这样的标签不应存储在列中,因为数量会随着时间的推移而快速增长。这没有任何意义。因此,为此构建一个包含id和keyword的表,以及一个包含post_id和keyword_id的链接表。您也可以省略keyword_id并直接链接post_id和关键字。 确保两个列的组合定义了主键,因此您无法在一个特定帖子中多次存储关键字。

对于属性,它可以是相同的。使用attribute_id,attribute_name和更多信息以及链接表attribute_id和post_id以及内容创建属性表并不是一种不好的做法。 您还可以使用attribute_ids轻松将其增强为多语言。

注释是相同的,存储在一个单独的表中,其中包含指向用户和帖子的链接:comment_id,user_id,post_id,content和parent_id,如果您希望评论再次可评论,则可以是comment_id。

这是一个简短的概述。