如何进行文章分类和标签的数据库设计

如何进行文章分类和标签的数据库设计,第1张

几乎在所有web项目中,都涉及文章分类和标签的设计,应该说这是一个比较常见、典型的案例。站长并不保证我的思路就是最好的,只是分享出来大家一起交流一下,互相促进与提高。我们假设的开发项目是一个博客系统,最核心的部分就是与文章相关的,那么我们今天讨论如何设计博客系统的文章分类和标签。1、首先,分类和标签都是要和具体的文章相关联的,当然也可能一些文章既没有分类也没有标签,这一点是大家在写查询的时候容易疏忽的地方。因为我们的第一感觉就是,在查询文章列表的时候关联分类表,查出所有的文章和分类,对应关系一般是文章表的分类id对应分类表的id,使用where子句进行限定。这里就存在一个问题了,由于使用了where子句,那么只能查询有分类的文章,而没有分类的文章就查询不到了。这时候怎么办?应该使用连接查询,left join,这要没有分类的文章,在文章分类id那一栏会显示null。通常我们只使用left join,而很少使用right join。2、一般,一篇文章最好只对应一个分类,当然如果你想要对应多个分类也可以。但站长并不提倡,文章在多个分类中重复会给人很不专业的感觉,即使有些文章可能确实设计到多方面的内容,那么你应就其中的侧重点来分类。而标签就不一样了,一篇文章可能有多个标签。这就意味着我们无法靠一个sql语句既查出所有文章的分类和标签,又做到查询结果中的文章id不重复。通常我们需要把查询出来的结果直接循环出来,那么这个结果一般是二维数组,第二维的都存储了唯一一篇文章的相关信息。但是,标签和文章是多对一的关系,多个标签对应一篇文章,如果你只用一条sql语句的话,那么我们查询出来的结果,当然也是多行,这不符合我们目标数据的要求。应此,需要在查询完文章和分类之后,在前面结果的基础上再查询一次文章标签,把两次的结果结合起来,存在数组中,这是对应文章列表页面的查询方法。对于具体文章页面,可以分两次查询。好了,还没有给出具体的数据库设计,就先说了如何查询结果,相信大家也看烦了,下面就举例说明:一、文章表:post,字段如下:id【唯一标识】,aid【作者id】,title【标题】,content【内容】,cid【分类id】二、分类表,category,字段如下:id【唯一标识,与post表的cid关联】,name【分类名】三、标签表,tag,字段如下:id【唯一标识】,name【标签名】四、标签与文章对应关系表,tag_relationship,字段如下:id【唯一标识】,postid【文章id,与post表的id关联】,tagid【标签id,tag表的id关联】有朋友可能会问:为什么要单独用一个表来存储文章与标签的对应关系,为什么不可以直接在tag表中增加一个文章id字段呢,比如:tag表:id,postid,name这样做的话,并不是不可以,但是,由于一篇文章对应多个标签,所以name字段的值会出现很多重复,比如一篇文章,假设文章id为1,有2个标签,php和mysql,那么在tag表会这样存储:id:1,postid:1,name:phpid2,postid:1,name:mysql另一篇文章,假设id为2,有2个标签,也是php和mysql,那么在tag表中它会这样存储:id:3,postid:2,name:phpid4,postid:2,name:mysql大家很快就发现了问题,这样的设计name字段也就是标签的名称在同一张表中可能会大量重复。但是这样设计的好处是,如果你要查询一个标签下有多少篇文章,只要单独查这个表就可以了,比如要查询含有php标签的文章有多少篇,只需要select count(name) �0�2from tag where name=’php’,就可以查出来。不好的地方是,如果要查询所有标签的集合,使用这种设计需要使用group by name语句来去除重复的行。如果用之前的那种,只需要select * from tag就可以了。一时之间,好像不太好取舍。这两种设计都会有数据冢余,第一种tag_relationship表中,存在tagid字段的重复;而这两种设计又都有各自的好处。那么我们到底该怎么选择呢?站长也说不好,所以无法为大家下结论。但是站长在研究wordpress数据结构的时候,发现wp是采用的单独建表存储文章与标签对应关系的方式。另外,如何设计有时候也是取决具体功能的需求的,所以这个问题就留给大家一起来讨论吧~ 标签:分类和标签, 博客数据库设计

Widows Phone应用程序可能需要更改本地数据库架构。Microsoft.Phone.Data.Linq命名空间提供了有关于数据库架构更改的DatabaseSchemaUpdater类。DatabaseSchemaUpdater类可以执行数据库,例如添加表、 列、 索引。对于更复杂的更改,需要创建一个新的数据库,并将数据复制到新的架构。DatabaseSchemaUpdater类提供了可用于以编程方式区分您的数据库的不同版本的DatabaseSchemaVersion属性。数据库不会反映来自DatabaseSchemaUpdater对象的更新,直到调用Execute方法。当调用该方法时,所有的更改将被提交到本地数据库作为单个事务,包括版本更新。

一、数据库表清理

1. wordpress数据库表

wp_commentmeta: 用于保存评论的元信息,在将评论放入回收站等 *** 作时会将数据放入此表,Akismet等插件也会生成此表的数据。此表不太重要

wp_comments: 用于保存评论信息的表

wp_links: 用于保存用户输入到Wordpress中的链接(通过Link Manager)的表

wp_options: 用于保存Wordpress相关设置、参数的表,里面包括了大量的重要信息

wp_postmeta: 用于保存文章的元信息(meta)的表

wp_posts: 用于保存你所有的文章相关信息的表,非常的重要。一般它存储的数据是最多的

wp_terms: 文章和链接分类以及文章的tag分类可以在表里找到

wp_term_relationships: 日志与wp_terms中的类别与标签联合起来共同存储在wp_terms_relationships表中。类别相关链接也存储在wp_terms_relationships中

wp_term_taxonomy: 该表格对wp_terms表中的条目分类(类别、链接以及标签)进行说明

wp_usermeta : 用于保存用户元信息(meta)的表

wp_users:用于保存Wordpress使用者的相关信息的表

2. 清理涉及到的表

更换主题,删除插件会在将数据留在数据库中,在卸载后无法被清理。除此之外,在由于一些 *** 作,会导致数据库的冗余,比如已经没有的评论,不应该在评论元数据表中有记录,由于没有外键的约束,这些记录没有被删除,会造成数据的冗余。本文的宗旨是删除掉不必要的数据库内容,提高wordpress的效率

在此,主要涉及到一下几张表:wp_options,wp_posts,wp_postmeta,wp_commentmeta

注意清理之前进行备份

3. wp_options的清理

wp_options 这个数据表是wordpress设置的全局数据,这个表会经常有数据膨胀。主要原因是:

(1)以前用过的一些插件、主题在删除之后没有进行设置的清理,造成残留数据

(2)占用数据的大户–RSS缓存,后台的数据调用竟然会放到数据库里面

处理方法:

①网上对RSS处理方法有两种一个是修改后台的文件直接不去调用,这个是我不喜欢的毕竟修改了程序,其实这个很容

易忘记WP升级是太频繁的哪次更新覆盖了新文件还是照样缓存.另外一种就是在配置文件里面填写define(‘MAGPIE_CACHE_ON’, ’0′)这个是管用的,添加以后后台首页的调用明显变慢

②使用插件clean options

③费力但是简单的清除方法:删除wp_options表,会删除一些设置,需要重新设置wordpress,推荐新手使用

TRUNCATE TABLE wp_options

4.wp_posts清理

wordpress的文章有好多:wp_posts表中包括

文章种类:文章、修订版本、页面、文章的附件、菜单

其中每种文章又会有很多状态:继承、发布、私有、草稿、自动草稿、回收站中

冗余原因:

(1)在博主写文章的时候,系统会保存很多的中间状态,在文章发布之后其很多的中间状态没有被删除

解决办法:

①使用插件:WP Cleaner,使用插件的好处就是有保护机制,无论怎么 *** 作都无法影响已发布的贴子,请放心使用

②自己动手删除,数据库中的标志删除文章,注意备份

说明:wp_posts的重要字段含义:

post_type:文章类型,post表示为文章,revision表示为修订版本,page为页面,attachment是文章的附件信息,nav_menu_item是菜单。这里我们需要的是文章、页面、和菜单

post_status:文章状态,inherit是继承的附件和文章的附带信息,publish是已经发布、private是私有的,draft是草稿,auto-draft是自动草稿,trash是在回收站。这里我们需要的是publish的状态的

这里我们主要是要 已经发布的文章、页面和菜单,除此之外的都可以删除,当然可以根据自己的需求选择删除哪些

DELETE FROM wp_posts

WHERE NOT(post_status = ‘publish’ AND post_type IN(‘post’,'nav_menu_item’,’ page’))

③去除WP保存修订版本的功能

WordPress默认的功能并不都是我们想要的,比如修订版本历史对于大多数人来说是无用的鸡肋功能。所以我么需要禁止一些博客功能,来达到较为符合个

人要求的博客应用。对于高手来说,可以直接修改程序的配置文件,来禁止相关功能。对于我等程序小白来说还是利用插件是最佳的选择

推荐中文插件SuperSwitch来关闭一些我们不需要的博客功能。这个插件可以关闭自动保存和修订历史版本,还可以关闭博客程序、主题、插件的自动更新。功能非常强大, *** 作及其简单。用SuperSwitch禁止了保存修订版本之后,文章序号就不会断得太厉害了

5.wp_postmeta清理

wp_postmeta是文章的元信息表,其数据是系统或者插件使用

冗余原因:

(1)文章被删除之后,其在wp_postmeta中的数据理应被删除,在系统中多数情况是系统自动删除,但是由于人为删除文章,系统不知道被删除,就不会删除wp_postmeta表中的数据,造成冗余

(2)很多主题、插件没有做好及时清除的工作

解决办法:

① 手动删除

规矩删除

删除文章中不存在文章的元信息

DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT post_id FROM wp_posts)

安全删除

删除_edit_lock和_edit_last条目是安全的,所以这里给出SQL语句

DELETE FROM wp_postmeta WHERE meta_key = ‘_edit_lock’

DELETE FROM wp_postmeta WHERE meta_key = ‘_edit_last’

风险删除

除了这两条还执行了一些其他语句由于有些风险:自己酌情考虑

DELETE FROM wp_postmeta WHERE meta_key = ‘_wp_old_slug’

DELETE FROM wp_postmeta WHERE meta_key = ‘_revision-control’

DELETE FROM wp_postmeta WHERE meta_value = ‘{{unknown}}’

特殊插件删除

postnav插件会记录每个文章的访问数,如果不需要,可以删除

DELETE FROM wp_postmeta WHERE meta_key = ‘views’

特殊 *** 作删除

在WordPress的后台上传图片或者附件后会在wp_postmeta中生成_wp_attached_file和_wp_attachment_metadata两个项,wp_posts也会记录附件的信息。如果使用FTP工具上传文件,表中就不会有这些信息

DELETE FROM wp_postmeta WHERE meta_key = ‘_wp_attached_file’

DELETE FROM wp_postmeta WHERE meta_key = ‘_wp_attachment_metadata’

洁癖删除

这几条条语句执行完毕能够删除掉95%以上的数据,算的上是极限优化了,最后考虑到这个数据表并不是很重要,有洁

净癖的人可以尝试清空这个表,当然我测试清空表会让一些原本的数据丢失

TRUNCATE TABLE wp_postmeta

6. wp_commentmeta清理

冗余原因:

(1)评论被删除之后,其在wp_commentmeta中的数据理应被删除,在系统中多数情况是系统自动删除,但是由于人为删除文章,系统不知道被删除,就不会删除wp_commentmeta表中的数据,造成冗余

(2)很多主题、插件没有做好及时清除的工作

解决办法:

一下语句去除没有用的数据,如果评论中没有此条评论,那么在wp_commentmeta也没有意义,好像wordpress在清空回收站的时候会删除wp_commentmeta相应的数据。如果不出意外,下面的 *** 作我们应该不需要做

DELETE FROM wp_comments WHERE comment_approved = ‘trash’

DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments)

在wp_commentmeta里面会记录评论被删除的时间,这些信息用处不是很大,当评论被从回收站删除之后,这些删除的时间意义就不是很大,就可以删除了,所以用下面的语句一样达到删除的目的

DELETE FROM wp_commentmeta WHERE meta_key LIKE ‘%trash%’

如果直接全部删除wp_commentmeta,影响不会太大,这里面不会涉及重要的数据

TRUNCATE TABLE wp_commentmeta

7. 总结

其实大部分无用的数据均在这几张表中,清理过后应该不会又太多的冗余数据了。但这里没有针对特殊插件或主题做数据库清理,有时这些插件和主题会悄悄动了一些数据库表,这样给清理带来很大难度,需要看代码才知道哦

二、数据库表优化

原理:数据库优化不

涉及数据的删除,是将数据库的表的状态调整好。在使用phpmyadmin时候,或许您会看到数据库表后面有多余xxMB的字样,这个指的是那些已经分配

给当前表但是却没有使用的空间。这个多余是没有什么害处的,他不会占用你的空间。当删除一个表的一部分记录时,这些记录仍然保持在一个linked

list 中,当插入新数据时会再次使用这些老纪录的位置。所以删除纪录会闲置一些空间造成你说的“多余”

优化:

(1)在phpmyadmin手动 优化或者修复表即可

(2)运行SQL:

OPTIMIZE TABLE wp_commentmeta

OPTIMIZE TABLE wp_comments

OPTIMIZE TABLE wp_links

OPTIMIZE TABLE wp_options

OPTIMIZE TABLE wp_postmeta

OPTIMIZE TABLE wp_posts

OPTIMIZE TABLE wp_terms

OPTIMIZE TABLE wp_term_relationships

OPTIMIZE TABLE wp_term_taxonomy

OPTIMIZE TABLE wp_usermeta

OPTIMIZE TABLE wp_users

(3)插件:Optimize DB

我是使用SQL语句进行清理与优化的,附我的优化SQL语句(我的表前缀是wp1):

DELETE FROM wp1_posts WHERE NOT(post_status = ‘publish’ AND post_type IN(‘post’,'nav_menu_item’,’ page’))

DELETE FROM wp1_postmeta WHERE meta_key in (‘_edit_lock’,

‘_edit_last’, ‘_wp_old_slug’, ‘_revision-control’, ‘{{unknown}}’,

‘_wp_attached_file’, ‘_wp_attachment_metadata’)

DELETE FROM wp1_postmeta WHERE post_id NOT IN (SELECT id FROM wp1_posts)

DELETE FROM wp1_comments WHERE comment_approved like ‘%trash%’

DELETE FROM wp1_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp1_comments)

OPTIMIZE TABLE wp1_commentmeta

OPTIMIZE TABLE wp1_comments

OPTIMIZE TABLE wp1_links

OPTIMIZE TABLE wp1_options

OPTIMIZE TABLE wp1_postmeta

OPTIMIZE TABLE wp1_posts

OPTIMIZE TABLE wp1_terms

OPTIMIZE TABLE wp1_term_relationships

OPTIMIZE TABLE wp1_term_taxonomy

OPTIMIZE TABLE wp1_usermeta

OPTIMIZE TABLE wp1_users


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6837544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-29
下一篇 2023-03-29

发表评论

登录后才能评论

评论列表(0条)

保存