假设你有以下架构。
用户有很多部门,(fk user_I'd)
每个部门HV很多办公室(fk department_I'd)
每个办公室HV很多交易(遇到s)(fk office_id)
现在的问题是,如果我想要获得用户的所有遭遇,我将需要搜索用户部门办公室中的所有愿望。
你认为有很多连接吗?
然而,如果我在遇到的表中包含树的所有外键?然后我可以做select * from encounters where user_I'd = X
然而,这使得我的桌子看起来很丑陋并且包含很多父母的重复数据!
所以我的问题是,在这种情况下,最佳做法是什么? 更多fk或更少并使用连接?
答案 0 :(得分:0)
当我设计表格时,我通常不会做任何冗余,而是在服务器端代码的服务层中保留多个连接的复杂性。如果您想在之后更改设计,它可以提供更大的灵活性。
这可能是宗教而非纯逻辑的问题,因此您可能需要更多类型的答案来决定。
答案 1 :(得分: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
答案 2 :(得分:0)
我自己不会打三个电话。只有这样才能知道非规范化遇到表的好处是否超过了成本,就是看看你是否遇到问题并用非规范化来解决它。在我看来,做出这个决定现在还为时过早。