假设我有一个博客帖子实体。
显然,评论应该是自己的表,与Blog表有多对一的关系。
但是“状态”或“标签”呢?你会把它放在另一张桌子上吗?或者你会坚持多列?
属性怎么样......如果它们太大了?因为随着我的网站的增长,博客文章将附加越来越多的属性(标题,作者,等等,等等......)。如果属性列表高达100,会发生什么?
答案 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
);
blog_entry
- 你的主桌,货物去哪里
be_state
- 在此处定义,并在state_id
blog_entry.state_id
个值
be_tag
- 有多个标签,就像我们在这里做的那样
blog_entry_tags
- 由于您可能为一个博客条目设置了许多标签,因此请将其存储在此处并将blog_entry.blog_entry_id
和相应的be_tag.tag_id
一起插入。每个博客条目的类型的一个标记。这意味着您无法将条目#1(例如)标记为php
两次或更多。
be_attribute
- 在此处存储属性定义,例如位置,作者等
blog_entry_attributes
- 类似于blog_entry_tags
,您可以在其中为博客条目分配一个或多个be_attribute
。
同样,这只是一种方法。
答案 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。
这是一个简短的概述。