Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 加强数据库设计_Mysql_Database_Database Design - Fatal编程技术网

Mysql 加强数据库设计

Mysql 加强数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我的CMS应用程序允许用户发布分类广告、文章、事件、目录、属性等,其数据库设计如下: 第一种方法: 每个部分(即“分类广告”、“事件”等)都有三个表,专门用于存储与其相关的数据: 分类: 机密职位 分类类别 分类职位类别 事件: 事件与邮政 事件类别 事件后分类 这同样适用于文章、属性、目录等。每个部分有三个表专门用于其帖子、类别。 这种方法的问题是: 数据库表太多。(这导致越来越多的车型, 控制器文件) 两个外键以避免关联表中的重复项 例如:假设表评论、评级、图像属于分类帖子,事件帖子等,那

我的CMS应用程序允许用户发布分类广告、文章、事件、目录、属性等,其数据库设计如下:

第一种方法: 每个部分(即“分类广告”、“事件”等)都有三个表,专门用于存储与其相关的数据:

分类:

  • 机密职位
  • 分类类别
  • 分类职位类别
  • 事件:

  • 事件与邮政
  • 事件类别
  • 事件后分类
  • 这同样适用于
    文章、属性、目录
    等。每个部分有三个表专门用于其帖子、类别。
    这种方法的问题是:

    • 数据库表太多。(这导致越来越多的车型, 控制器文件)
    • 两个外键以避免关联表中的重复项

      例如:
      假设表
      评论、评级、图像属于
      分类帖子
      事件帖子
      等,那么表的结构应该是:
      图像
      [id,post\u id,section]
      第二个FK部分必须存储并关联,以避免重复发布。
    第二种方法: 这种方法将有一个posts表,该表具有与每个posts关联的部分列作为外键。i、 e

    post
    id、section、title等
    值(1,'classifieds','abc')(2,'events','asd')
    虽然第二种方法在执行sql查询时有点麻烦,但它在执行关系表查询时简化了过程。例如:表格图像、评分、评论属于posts表格。
    图像
    [id,post\u id(FK)]

    虽然这种方法看起来干净简单,但最终会在posts表中出现大量列,其中包含与事件、分类、目录等相关的列,这将在查询行和列时导致性能问题。
    这同样适用于类别。它可以是两种方法中的任何一种,或者将列另存为第二个外键,或者为每个节都有单独的表(第一种方法)

    所以现在我的问题是,哪种方法被认为比另一种更好?这两种方法中有哪一种在性能方面优于另一种吗?或者,在处理这些范例时,最好的解决方法是什么

    我会考虑第二种方法。

    标准的数据库设计指南是,设计者应首先创建一个数据库,然后出于性能原因可以执行选择性数据库设计。

    规范化是组织关系数据库的字段和表以最小化冗余依赖性的过程
    非规范化是通过添加冗余数据或分组数据来优化数据库读取性能的过程。

    提示:构建第一个数据库的程序员通常主要关注性能。毫无疑问,性能很重要。一个糟糕的设计很容易导致数据库操作花费的时间是它们应该花费的时间的十到一百倍。

    可以看到一个非常可能的例子


    遵循上述方法的草案模型可能是:

    方法1存在表太多的问题

    方法2的列太多

    考虑将数据存储在一个表上,如方法2,但将所有可选外键数据存储在XML中

    XML字段将只包含特定节所需的数据。如果添加了一个新的部分,那么只需将此类数据添加到XML中

    你的桌子可能看起来像

    UserID  int FK
    ImageID int FK
    ArtifactCategory int FK
    PostID int FK
    ClassifiedID int FK
    ...
    Other shared
    ...
    Secondary xml
    

    现在你既没有太多的列,也没有太多的表

    我钦佩那些试图回答问题的人的勇气……我的2美分:如果你有足够的资源,选择选项1。它更灵活,更易于扩展。然而,生产将需要更长的时间。在使用泛化之前,考虑需求的未来变化。@莫森,我只是好奇为什么你必须将分类名称从分类邮件帖子改为分类帖子和类别到类别!只是好奇。。标准化的非复数表名。我尊重Microsoft对SQL server数据库的命名约定。但由于comments或users表存储多个注释或用户,将其命名为comments、users而不是(单数)注释,因此用户听起来更符合逻辑。由于我正在为我当前的项目开发一个基于Php的框架,该框架严格遵循数据库表的复数名称,所以我最好还是坚持使用它。命名完全是基于意见的,但请想一想:注释表中的一行本身就是注释,就像EMP表中的员工一样。在此视图中,表由它们自己处理,而不是由它们的关系处理。数据库设计似乎比微软或PHP更抽象