数据建模,我应该使用多少fk?

时间:2014-02-16 17:49:48

标签: mysql database database-design backbone-relational

假设你有以下架构。

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

每个部门HV很多办公室(fk department_I'd)

每个办公室HV很多交易(遇到s)(fk office_id)

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

你认为有很多连接吗?

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

然而,这使得我的桌子看起来很丑陋并且包含很多父母的重复数据!

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

3 个答案:

答案 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)

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