数据库表:一对多不同类型

时间:2012-03-28 03:04:53

标签: database database-design relational-database

由于我的工作没有披露,我已经创造了一个类比的情况。请尽量专注于问题,而不是“为什么不重命名这个表,m,erge那些表等”。因为实际问题要复杂得多。

继承人,

假设我有一份“员工薪酬上涨”记录,必须获得批准。

有一个包含单个“用户”的表格。

有些表将用户组合在一起,例如“经理”,“高管”,“薪资”,“财务”。这些分组是具有不同属性的不同类型。

创建“PayRise”记录时,创建记录的用户还会选择多个这些组(经理,高管等)和/或可以“批准”加薪的单个用户。

将单个“EmployeePayRise”记录与0个或更多用户记录以及每个分组中的0个或更多相关联的最佳方法是什么。

4 个答案:

答案 0 :(得分:0)

我会假设用户已链接到这些群组?如果是这样,在这种情况下,我只是将employeePayRise记录链接到它应用的一个用户和可以批准的用户。所以基本上你有两列代表这个。 EmployeePayRise.employeeId和EmployeePayRise.approvalById列。如果您需要访问组,则需要加入EmployeePayRise.employeeId = Employee.id记录。保持简单,不要过度复杂化您的设计。

答案 1 :(得分:0)

我的第一个想法是创建一个表格,将各个审批人与支付上涨行联系起来。

create table pay_rise_approvers (
  pay_rise_id integer not null references some_other_pay_rise_table (pay_rise_id),
  pay_rise_approver_id integer not null references users (user_id),
  primary key (pay_rise_id, pay_rise_approver_id)
);

有时您不能拥有引用管理员的好外键,而有时会引用工资单。用户似乎是外键的逻辑目标。

如果创建工资增长行的人(未显示)选择管理员,则用户界面负责将每个经理一行插入此表。那部分很容易。

出现在多个群组中的人可能会遇到问题。我可以想象一个副总统出现在“执行”和“财务”小组中。我认为这不是特别难以处理,但确实需要一些深谋远虑。假设输入数据的人改变了主意,并决定从表中删除所有管理人员。是否应该取消同时从事财务工作的高级管理人员?

另一个问题是,很有可能不允许每个用户批准加薪。在实施任何解决方案之前,我会考虑一下。

答案 2 :(得分:0)

我知道它看起来很难看,但我认为解决方案可能是在表中使用table_name和联合查询

create table approve_pay_rise (
  rise_proposal varchar2(10)     -- foreign key to payrise table
, approver varchar2(10)          -- key of record in table named in other_table
, other_table varchar2(15) );

insert into approve_pay_rise values ('prop000001', 'e0009999', 'USERS');
insert into approve_pay_rise values ('prop000001', 'm0002200', 'MANAGERS');

然后在代码中使用case语句,为每个other_table值重复语句(select ... where other_table ='' .. select ... where other_table ='' )或工会选择。

我不得不承认,当我遇到它时,我会不寒而栗,现在我在打完推荐之后会洗手,但它确实有效。

答案 3 :(得分:0)

听起来你可能需要两个表(“ApprovalUsers”和“ApprovalGroups”)。 SELECT语句将是来自“ApprovalUsers”的UserIds的UNION和来自与PayRiseId相关的“ApprovalGroups”的任何其他用户组的UserID。

SELECT UserID
INTO   #TempApprovers
FROM   ApprovalUsers 
WHERE  PayRiseId = 12345

IF EXISTS (SELECT GroupName FROM ApprovalGroups WHERE GroupName = "Executives" and PayRiseId = 12345)
BEGIN
    SELECT UserID
    INTO   #TempApprovers
    FROM   Executives
END

.... 
编辑:这会/可能会复制UserIds,所以你可能想要GROUP BY UserID(即SELECT UserID FROM #TempApprovers GROUP BY UserID)