0

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

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('contain' => ....)); ?

在这一点上我有点失落。任何帮助,将不胜感激。你将如何实现这一点?

4

3 回答 3

3

你说:

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

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

很容易问“如果用户一次只有一张照片,并且只有一个配置文件,为什么要将它们与用户表分开?”,但有一些理由将它们分开。

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

在帖子表中,为什么要同时记录用户 ID 和个人资料 ID?同样,它给你一个复杂的约束来强制执行没有明显的好处。个人资料ID就足够了;从那里你可以找到用户。

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

解决这些问题,您将获得更可行的设计。但是,我不确定我是否发现了此大纲模式中存在的所有异常。

于 2009-10-31T02:57:00.567 回答
2

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

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

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

附加到用户的个人资料和照片 habtm 个人资料,以便您可以将无限数量的照片附加给用户。我喜欢保持我的用户模型精简,只包含 Auth 组件所需的内容。Profile Model 是我保存名字、姓氏、年龄、城市等的地方。

Use an Upload Behavior ( MeioUpload ) on the Photo Model to handle the uploads automatically.

This should be a sound starting point for you to revise your design from.

http://cakeapp.com/sqldesigners/sql/centro

password : centro

于 2009-11-03T19:08:21.657 回答
0

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

于 2009-10-31T21:05:15.140 回答