与我的一位同事进行了一次小小的辩论,他们负责在我们的一个软件产品中设计一些表格。
我的同事建议使用这样的结构,我将表格简化为几列直接指向:
Table Buildings
Columns: buildingId,address,zipcode, ...
PK: buildingId
Table Offices
Columns: buildingId, officeId, officeName, ...
PK: buildingId, officeId
Table Workers
Columns: buildingId, OfficeId, workerId, name, surname
PK: buildingId, OfficeId, workerId
根据定义"选择"要使用代理键,例如buildingId
,OfficeId
和workingId
,我告诉我的观点是:
officeId
,buildingId
为FK workerId
,officeId
为FK,我将完全省略BuildingId
,因为这是多余的。所以结果将是这样的:
Table Buildings
Columns: buildingId,address,zipcode, ...
PK: buildingId
Table Offices
Columns: buildingId, officeId, officeName, ...
PK: officeId
FK: buildingId
Table Workers
Columns: officeId, workerId, name, surname
PK: workerId
FK: officeId
我的同事告诉我,按照他的建议选择PK更自然,使用这些PK查询这些表格的表现会更好,父/子关系也会更清楚
例如,他告诉我,在他的模型中使用officeId
和buildingId
查询工具的查询将比仅使用officeId
更快。
在我看来,在表中使用buildingId
是非规范化的,并且可能在将来导致问题(例如,丢失数据完整性时出现更新错误,以非正确的方式更新buildingId
表工人)。
我认为正确使用索引是在这种情况下提高性能的正确方法,而不是声明父表PK"作为儿童表的一部分"的PK。我也认为"父母/孩子"关系是比RDBMS更分层的DBMS。
有什么建议吗?