Database design 数据库设计概念

Database design 数据库设计概念,database-design,cakephp,erd,Database Design,Cakephp,Erd,我刚开始一个项目,需要朝着正确的方向推动一下。以下是我的表格结构: users departments sub-departments ------- ------- ------- id id id name name name email password created modified posts photos pro

我刚开始一个项目,需要朝着正确的方向推动一下。以下是我的表格结构:

users         departments     sub-departments
-------       -------         -------
id            id              id
name          name            name
email
password
created
modified

posts         photos        profiles
-------       -------       -------
id            thumbnail     id
content       large         photo_id
created       created       user_id
user_id       profile_id    department_id
profile_id    id            sub-department_id
profiles表还有大约5个无关紧要的字段。如果这一切看起来有点不对劲的话,那很可能是

users have one department
users have one sub-department
users have many posts
users have one photo
users have one profile
我“想要”做的是创建我所需要的所有表,并使用外键将它们放在profile表下。我的配置文件模型的一个片段如下所示:

var $belongsTo = array('User', 'Department', 'Sub_Department', 'Photo')
var $hasMany = array('Comment');
如果你现在想的是“WTF是垃圾吗?”。。我就在你身边。这个协会从事脚手架工作。但我不想在我真正开始插入逻辑时遇到麻烦

我对ERD和CakePHP还是新手。我是否应该声明属于该用户的所有内容,并在ProfilesController下从那里进行查询,比如$this->Profile->User->find('all',array('contain'=>…)

我现在有点迷路了。任何帮助都将不胜感激。您将如何实现这一点?

您说过:

  • 用户有一个部门
  • 用户有一个子部门
  • 用户有很多帖子
  • 用户有一张照片
  • 用户只有一个配置文件
有趣的术语…用户在一个部门工作,事实上,在一个子部门工作。由于子部门可能只是一个部门的一部分,因此不需要在概要表中同时记录部门和子部门。事实上,如果您同时记录了这两种情况,则需要执行一个复杂的约束。所以,除非你有什么没告诉我们的,否则档案中不需要这个部门。尽管如此,我注意到部门和子部门之间实际上没有交叉引用,因此单个子部门显然可以与多个部门关联——没有什么可以阻止子部门1与一个在部门1工作的人和另一个在部门2工作的人关联。这是不寻常的-不一定是错的,但不是大多数组织的工作方式

有人会问“如果用户一次只有一张照片,并且只有一个个人资料,为什么要将它们从用户表中分离出来?”,但有一些理由将它们分开

建模表中的一个关键点是识别自然主键。ID列不计数,也可以计数,但您需要确定哪些列的其他组合必须是唯一的。例如,在Profile表中,虽然有一个Profile ID,但根据您所述的规则,用户ID必须是唯一的,因此实际上Profile ID是多余的—实际上是浪费空间(两次;一次用于数据列,一次用于将在其上创建的索引)。现在,如果您确定一个用户随着时间的推移可能有多个概要文件,并且概要文件有一个有效期,或者类似的内容,那么概要文件ID列是有意义的,但是最后一点不再有效

在posts表中,为什么同时记录用户ID和配置文件ID?同样,它给了您一个复杂的约束,要强制执行,但没有明显的好处。配置文件ID足够;从中可以找到用户

你说一个用户有一张照片,但这不是你所模拟的。您已建模“每个配置文件都有一张照片,一张照片仅由一个配置文件使用”。类似地,事实上,您没有建模“用户有一个子部门”;您已建模“配置文件有一个子部门”。这很可能是草率定义的问题,但您需要小心,因为草率定义会导致草率的数据库,草率的数据库会导致错误的答案和糟糕的性能

解决这些问题,你将有一个更可行的设计很长的路要走。但是,我不确定我是否发现了这个大纲模式中存在的所有异常情况。

你说:

  • 用户有一个部门
  • 用户有一个子部门
  • 用户有很多帖子
  • 用户有一张照片
  • 用户只有一个配置文件
有趣的术语…用户在一个部门工作,事实上,在一个子部门工作。由于子部门可能只是一个部门的一部分,因此不需要在概要表中同时记录部门和子部门。事实上,如果您同时记录了这两种情况,则需要执行一个复杂的约束。所以,除非你有什么没告诉我们的,否则档案中不需要这个部门。尽管如此,我注意到部门和子部门之间实际上没有交叉引用,因此单个子部门显然可以与多个部门关联——没有什么可以阻止子部门1与一个在部门1工作的人和另一个在部门2工作的人关联。这是不寻常的-不一定是错的,但不是大多数组织的工作方式

有人会问“如果用户一次只有一张照片,并且只有一个个人资料,为什么要将它们从用户表中分离出来?”,但有一些理由将它们分开

建模表中的一个关键点是识别自然主键。ID列不计数,也可以计数,但您需要确定哪些列的其他组合必须是唯一的。例如,在Profile表中,虽然有一个Profile ID,但根据您所述的规则,用户ID必须是唯一的,因此实际上Profile ID是多余的—实际上是浪费空间(两次;一次用于数据列,一次用于将在其上创建的索引)。现在,如果您确定一个用户随着时间的推移可能有多个概要文件,并且概要文件有一个有效期,或者类似的内容,那么概要文件ID列是有意义的,但是最后一点不再有效

在posts表中,为什么同时记录用户ID和配置文件ID?同样,它给了您一个复杂的约束,要强制执行,但没有明显的好处。配置文件ID足够;从中可以找到用户

你说一个用户有一个phot