我刚开始一个项目,需要向正确的方向努力。这是我的表结构:
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'=> ....)); ?
此时我有点失落。任何帮助,将不胜感激。你会如何实现这个?
答案 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数据库设计概念。