数据库设计概念

时间:2009-10-31 01:59:58

标签: database-design cakephp erd

我刚开始一个项目,需要向正确的方向努力。这是我的表结构:

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

个人资料表还有大约5个字段,这些字段无关紧要。如果其中任何一个看起来有点偏,它可能是。

users have one department
users have one sub-department
users have many posts
users have one photo
users have one profile

我“想要”做的是创建我需要的所有表,并使用外键将它们全部放在配置文件表下。我的个人资料模型的CakePHP代码段如下所示:

var $belongsTo = array('User', 'Department', 'Sub_Department', 'Photo')
var $hasMany = array('Comment');

如果到现在为止你在想“WTF就是这个废话?”......我就在你身边。这种关联在脚手架中起作用。但是当我真正开始插入逻辑时,我不想遇到麻烦。

我还是ERD和CakePHP的新手。我应该声明属于用户的所有内容以及我的ProfilesController查询,例如$ this-> Profile-> User-> find('all',array('contains'=> ....)); ?

此时我有点失落。任何帮助,将不胜感激。你会如何实现这个?

3 个答案:

答案 0 :(得分:3)

你说:

  • 用户有一个部门
  • 用户有一个子部门
  • 用户有很多帖子
  • 用户只有一张照片
  • 用户有一个个人资料

有趣的术语......用户在一个部门工作,实际上,在一个子部门工作。因为,大概是一个子部门只是一个部门的一部分,所以您不需要在配置文件表中记录部门和子部门。实际上,如果您同时记录两者,则需要执行复杂约束。所以,除非你没有告诉我们什么,否则在个人资料中不需要该部门。虽然,我注意到部门和子部门之间实际上没有交叉引用,因此单个子部门显然可以与多个部门相关联 - 没有什么可以阻止1号子部门与一个人相关联在部门1和另一个在部门2工作的人工作。这是不寻常的 - 不一定是错的,但不是大多数组织工作的方式。

有人试图询问“如果用户一次只有一张照片,并且只有一个配置文件,为什么要将这些配置文件从用户表中分开?”,但是有一些原因可以将它们分开。

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

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

你说用户有一张照片,但这不是你建模的。您已经建模'每个配置文件都有一张照片,而照片只能由一个配置文件使用'。同样,事实上,你没有建模'用户有一个子部门';你已经建模'个人资料有一个子部门'。很可能这是一个草率定义的问题,但你需要小心,因为草率的定义会导致数据库不稳定,而且草率的数据库会导致错误的答案和糟糕的性能。

解决这些问题,你需要一个更有效的设计方法。但是,我不确定我是否已发现此大纲架构中存在的所有异常情况。

答案 1 :(得分:2)

我提供了一个示例架构/图表供您查看。

有几点需要注意。 Post模型(posts表)有一个字段slug。使用Sluggable行为来处理为此创建slu ..

部门模型(departments表)有一个名为department_id的字段,此 应该是parent_id,但构建器工具会抛出错误。根据需要更改它。 lft,rght和parent_id字段对应于树行为。在部门模型上使用树行为将允许部门任意地属于“父”部门。这可以防止您需要sub_departments表,因为子部门实际上是一个将parent_id设置为其他部门ID的部门。

附加的用户个人资料和照片habtm个人资料,以便您可以将无限数量的照片附加到用户。我喜欢保持我的用户模型精益,只有Auth组件需要的东西。配置文件模型是我保留first_name,last_name,年龄,城市等的地方。

使用照片模型上的上传行为(MeioUpload)自动处理上传。

这应该是您修改设计的良好起点。

<强> http://cakeapp.com/sqldesigners/sql/centro

密码: centro

答案 2 :(得分:0)

您可以在CakeApp.com上测试CakePHP数据库设计概念。