2009-10-31 89 views
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'); 

如果现在你想:“跆拳道是这个垃圾?” ..我就与你同在。这个协会在脚手架上工作。但是当我真正开始接触我的逻辑时,我不想遇到麻烦。

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

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

+0

我尽了最大努力正确地格式化的模式,但在它悲惨地失败了。请尽量理解它:( – cp3 2009-10-31 02:02:07

+3

已修复此问题:提示:在发布之前将标签转换为空格。 – Artelius 2009-10-31 02:14:24

+0

感谢您的提示!已注意。 – cp3 2009-10-31 04:26:24

回答

3

你说:

  • 用户有一个部门
  • 用户有一个子部门
  • 用户有很多帖子
  • 用户一个照片
  • 用户有一个配置文件

有趣的术语...用户在一个部门工作和d,实际上,在一个分部门工作。由于大概一个子部门只是一个部门的一部分,因此您不需要在部门档案表中记录部门和子部门。事实上,如果你确实记录了两者,你就有一个复杂的限制来执行。所以,除非你没有告诉我们什么,否则这个部门在配置文件中是不需要的。但我注意到,部门和子部门之间实际上没有交叉参照,因此一个子部门显然可以与多个部门相关联 - 没有什么可阻止子部门1号与一个人联系在一起在部门1工作,在另一个部门工作的人员2。这是不寻常的 - 不一定是错误的,但不是大多数组织工作的方式。

有人会问“如果用户每次只有一张照片,并且只有一个配置文件,为什么要将这些文件与用户表分开?”,但有一些理由让它们保持分离。

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

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

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

修复了这些问题,您将有更多可行的设计。但是,我不确定是否发现了这个大纲模式中存在的所有异常。

+0

真棒!我想感谢您花时间解释错误在我的设计中,我同意它是马虎,这是我做的第一个复杂的(对我来说)设计 – cp3 2009-10-31 04:24:17

+0

注:这个评论不适合,所以我发布了两个。建议发表评论:\ “有一种诱惑要问”用户是否一次只有一张照片,并且只有一个配置文件,为什么要将这些配置文件与用户表分开?“,但有一些原因需要保留他们分开。“ 我已经计划允许用户将来有多张照片,它仍然在播放。你的意思是关于我的个人资料表。你说的用户表可以是实际的“配置文件”。然后我会在用户和帖子之间声明HABTM吗? – cp3 2009-10-31 04:25:37

+1

我不得不去看看HaBTM - http://www.acronymfinder.com/知道你的意思。如果您将个人资料和用户结合在一起(但您可能会合法决定将个人资料与用户分开),那么是的,您会在用户和帖子之间声明“拥有并属于许多”(而不是简介和帖子之间的HaBTM)。 – 2009-10-31 05:46:36

2

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

有几件事要注意。邮政模式(邮政表)有一个字段slug。使用可溶性行为在这里为你创建slu gs。

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

附加的用户配置文件和照片habtm配置文件,以便您可以将无限数量的照片附加到用户。我喜欢保持我的用户模型精益,只有Auth组件需要什么。配置文件模型是我要保留的名字,姓氏,年龄,城市等。

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

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

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

密码:炫酷

+0

很酷的应用程序!好的提示! – powtac 2009-11-12 17:25:57