坚持如何用正确的“蛋糕方式”做模型数据?

时间:2013-09-12 15:55:12

标签: cakephp database-design cakephp-2.0

我正在尝试构建一个工具来帮助我的团队规划活动。部分图解释我的问题:

Diagram

Larger Image

Actions hasMany Teams通过hasManyThrough(actions_teams)具有不同的角色(即潜在客户,次要角色)

Actions通过hasManyThrough(linkages)链接到父/子关系中的其他操作

REQUIRED: 我希望能够知道,对于给定Actionid,在给定角色中附加(actions_teamTeam(s),执行这些操作Team(s)将linkage返回Actionid(即列出Actionid作为linkages中的父级})?

通过使用循环和/或Containable能够高度控制返回的数据,我已经想出了如何在两个控制器甚至视图中执行此操作。但是,我会经常提出这个问题,我宁愿以某种方式在数据库中实现它。

我需要的关系似乎是2个连接表的连接表? (actions_teamslinkages)。或者是使用counterCache的解决方案?我被卡住了。

任何建议或提示将不胜感激。 TIA!

1 个答案:

答案 0 :(得分:1)

必须假设联系只有1级(即,我们不能从其父级以外的子项检查。如果您的给定action_id是团队行动的祖父母或曾祖父母,这将不起作用。 )而不是创建1个带有(可能)派生表,子选择等的巨型SQL语句,而不是从视图开始建立“潜在团队列表”。

如果没有看到实际数据,请创建此视图以确保存在不同的列表(如果这三个字段包含唯一索引,您可以避免使用此视图。)

CREATE VIEW vw_team_listing AS
SELECT DISTINCT team_id, action_id, action_role_id
FROM actions_teams;

{案例陈述是因为你问,“团队有联系吗?”您可以为那些已经或者没有链接(而不是两者)}

的团队创建一个select语句
SELECT vw_team_listing.team_id AS team_id,
CASE
WHEN EXISTS(
SELECT *
FROM linkages
JOIN actions_teams
ON linkages.child_action_id = action_teams.action_id
WHERE linkages.parent_id = vw_team_listing.action_id
AND actions_teams.team_id = vw_team_listing.team_id
)
THEN 'Linked'
ELSE 'Not Linked'
END AS answer
FROM vw_team_listing
WHERE vw_team_listing.action_id = 'GIVEN_ACTION_ID'
AND vw_team_listing.action_role_id = 'GIVEN_ACTION_ROLE_ID';