【发布时间】:2012-07-20 20:16:47
【问题描述】:
所以我有一个设计,将人们分组,这些组决定每个人保存哪些属性。
因此,如果以后我决定要拥有 VIP 客户并记录他们的 VIP 号码,我可以创建一个名为“VIP 成员”的新组,并使用属性“VIP_Number”并将这些客户放在该组中。
因此,员工和其他客户没有与他们无关的字段。
现在,从给定人员的单独表中获取所有必需数据的最佳方法是什么?我需要一个支持以后添加的数据表的解决方案。
这是桌子的设计。
注意事项:
- “d”前缀用于数据表
- “x”前缀用于交叉引用表
- “p”前缀用于属性
- 我使用了不同长度的 ID 来帮助提高可读性
- John Smith 是员工,因此也是人。
- Anna Backhouse 是客户,因此也是人。
- Mr Both 既是员工又是客户,因此也是个人。
dPeople
ID pFirst_Name pLast_Name
----------------------------------------------------------
001 John Smith
002 Anna Backhouse
003 Mr Both
dEmployees
ID pBadge_Code
----------------------------------------------------------
01 MB2012
02 JS2012
dCustomers
ID pPhone_Number
----------------------------------------------------------
01 1800 backhouse
02 1800 both
dGROUPS
ID pGroup_Name
----------------------------------------------------------
1 People
2 Employees
3 Customers
xGROUPS
dGROUPS_ID_parent dGROUPS_ID_child
----------------------------------------------------------
1 1
1 2
1 3
xPeople
dPeople_ID dGROUPS_ID
----------------------------------------------------------
001 2
002 3
003 2
003 3
xEmployees
dPeople_ID dEmployees_ID
----------------------------------------------------------
001 02
003 01
xCustomers
dPeople_ID dCustomers_ID
----------------------------------------------------------
002 01
003 02
查找 Mr Both 时的期望结果:
ID pFirst_Name pLast_Name pBadge_Code pPhone_Number
----------------------------------------------------------
003 Mr Both MB2012 1800 both
查找 John Smith 时的期望结果:
ID pFirst_Name pLast_Name pBadge_Code
----------------------------------------------------------
001 John Smith JS2012
查找 Anna Backhouse 所需的结果:
ID pFirst_Name pLast_Name pPhone_Number
----------------------------------------------------------
002 Anna Backhouse 1800 backhouse
我可以得到他们正在使用的所有组的列表:
SELECT `dGROUPS`.`ID` AS `Group ID`, `dGROUPS`.`pGroup_Name` AS `Group Name` FROM `dGROUPS`, `xGROUPS` WHERE `xGROUPS`.`dGROUPS_ID_parent` = `dGROUPS`.`ID` AND (`xGROUPS`.`dGROUPS_ID_child` IN (SELECT `dGROUPS_ID` FROM `xPeople` WHERE dPeople_ID = 003))
当我有更多的子组(例如人员 > 员工 > 经理)时,这很有帮助
我想我需要运行此查询并使用它动态地形成另一个查询以获得所需的结果。我不介意使用两个查询,但最好使用一个。
也许有使用视图的解决方案?
我正在使用 PHP 和 MySQL。
【问题讨论】:
标签: php mysql sql database-design