2014-02-16 29 views
1

假设你有以下架构。数据建模,我应该使用多少个fk?

用户有很多部门,(FK user_I'd)

各部门HV许多办公室(FK department_I'd)

每个办公室HV许多交易(遭遇S)(FK office_id)

现在的问题是,如果我想要获得用户的所有遇到的情况,我将需要搜索用户的部门中的办公室中的所有用例。

这是许多加入不ü认为?

然而,如果我在遇到表中包含树的所有外键?然后,我可以做select * from encounters where user_I'd = X

然而,这使我的表看起来丑陋,含有大量的父母我会重复的数据!

所以我的问题是,什么是在这种情况下,最好的做法? 更多fk或更少并使用连接?

+0

什么是你的商业模式遭遇?我认为答案也可能取决于您需要多少次请求遇到用户而不是遇到办公室。如果你只关心用户遇到的情况,那么你应该改变你的模型,以减少对这个请求的连接。如果这是一个罕见的要求,那么最慢的一个可以用于更自然的设计。 – Pierre

+0

丹ehr系统,遇到的是通常发生在办公室内的病人 - 医生互动 - 只有一次遭遇可以有许多医生..我保持简单,为了例子 – Zalaboza

回答

0

当我设计我的表格时,我通常没有任何冗余,而是将多个连接的复杂性保留在服务器端代码的服务层中。如果您想在之后更改设计,它可以提供更大的灵活性。

这可能是宗教,而不是纯逻辑的问题,所以你可能需要排序决定的更多的答案。

+0

我喜欢那样..但不知道如果我可以负担得起这样的灵活性对性能的影响,但我会记住:),谢谢 – Zalaboza

0

首先,这真的不是那么糟糕的层次结构。如果您想要在所有与特定用户关联的场景中进行大量查询,请创建视图。这可能是这样的:

create view Encounters as 
select 
    Transactions.Id as TransactionId, 
    Offices.Id as OfficeId, 
    Departments.Id as DepartmentId, 
    Users.Id as UserId 
    -- other fields 
from Transactions 
join Offices on Transactions.OfficeId = Offices.Id 
join Departments on Offices.DepartmentId = Departments.Id 
join Users on Departments.UserId = Users.Id 

这样,您就可以执行任何ID字段的查询,而不必重新每次连接,select * from Encounters where UserId = 12345

0

不会把三个不少自己。只有这样才能知道非规范化遇到的好处是否超过了成本,是看看你是否遇到问题并通过非规范化来解决问题。我认为现在做出这个决定还为时过早。

相关问题