zoukankan      html  css  js  c++  java
  • 为什么要把某些数据库表设计成一对一的关系

    设计成一对一关系的数据表属于"数据表垂直切分", 主要优点是更新/插入是可以减小锁表时间, 查询时可以减小读取的数据量. 如果把两个表文件保存在不同的硬盘上, 那么查询的性能可以更高.

    当然,如果数据切分得不合理, 性能反而更差.


    为什么要用一对一的关系, 直接放在一张表里不好吗? 这样只操作一张表, 很好维护.

    一对一的关系有什么好处?难道是把大字段单独存可以提高查询性能吗?

    CREATE TABLE jforum_posts (
        post_id INT NOT NULL auto_increment,
        topic_id INT NOT NULL default '0',
        forum_id INT NOT NULL default '0',
        user_id INT NOT NULL default '0',
        post_time datetime default NULL,
        poster_ip varchar(15) default NULL,
        enable_bbcode tinyint(1) NOT NULL default '1',
        enable_html tinyint(1) NOT NULL default '1',
        enable_smilies tinyint(1) NOT NULL default '1',
        enable_sig tinyint(1) NOT NULL default '1',
        post_edit_time datetime default NULL,
        post_edit_count INT NOT NULL default '0',
        status tinyint(1) default '1',
        attach TINYINT(1) DEFAULT '0',
        need_moderate TINYINT(1) DEFAULT '0',
        PRIMARY KEY (post_id),
        KEY (user_id),
        KEY (topic_id),
        KEY (forum_id),
        KEY(post_time),
        INDEX (need_moderate)
    ) TYPE=InnoDB;
    
    CREATE TABLE jforum_posts_text (
      post_id INT NOT NULL PRIMARY KEY,
      post_text TEXT,
      post_subject VARCHAR(100)
    ) TYPE=InnoDB;

    好处很多,简单说几个:

    1、第一张的表结构,在IO存储的时候,每行数据都是等长的,这个表的设计真的花了心思了。唯独:poster_ip varchar(15),其实ip也可以用整型。

    2、第二张表第一个特点,post_id不是自增的,自增主键是要靠锁表产生新的主键值的。所以,这个表不存在这个自增约束的问题。很早以前做过测试,有自增和无自增的条件下,插入速度会有很大的差别。但post_id其实可以做一个索引。

    3、第一张表实际上是状态表,帖子的状态随时在变,第1、已经说了,由于其在IO存储时的特性,决定了这个表在读写方面有一定优势。

    4、内容分离,这个大家都说了。内容分离还有好处,在做数据索引等外围操作的时候,速度会更好。内容分离其实对于审查等,也十分方便。不过内容分离造成了代码在逻辑上的复杂度。

    MySql在百万级的时候,只要看配置和表优化良好,一般查写还不会有太大的问题(我试过用MyISAM做Session表,上千万了,就是查询会缓慢,不过还能插新session,当然,这时应该做得事情就是清空session表)。但他InnoDB,要用事务回滚,是为了防止关联操作时发生数据异常。MyISAM作为log应用,是非常强大的。InnoDB做第二张表,我还是会有些惊。其实可以加个last_modify字段,内容表是允许冗余的,只要通过检查last_modify就能拿出有效的数据了。日常管理,检查post_id出现冗余的字段进行清空即可了。这样第一张表操作开事务,第二张写入异常则食物回滚,不然就commit。

    其实还是有可以优化的地方的,我喜欢将日期时间等都用整型处理,这样做表转移也会简易很多。当然,个人习惯。

    以上内容来自互联网!

  • 相关阅读:
    消息(5)——WSE增强的web服务套件,MTOM附件
    消息(4)——WS附件传输,包体中的base64编码附件
    WCF消息之XmlDictionaryWriter
    Aptana使用技巧—Aptana2.0系列教程
    [f]获取URL中的参数[转]
    [f]获取元素在页面的位置getPos
    手机wap2.0网页缩放设置
    WPF SnapsToDevicePixels作用
    Silverlight获取控件绝对位置
    浏览器: F5 和 Ctrl+F5的区别
  • 原文地址:https://www.cnblogs.com/robinunix/p/7403164.html
Copyright © 2011-2022 走看看