sql*_*man 7 normalization database-design
我有一个大约有 40-50 个表的数据库。除了 5 个之外,所有其他人都是 1:M 关系的巨大层次结构的一部分,这些关系都指向一个单独的父级(称为“项目”)。每个表都使用父主键的外键连接到它的直接父表,主键是一个标识字段。一些分支深达 6 或 7 层。许多表有数百万行。几乎所有查询都需要返回与单个项目有关的特定表的所有记录。查询通常只返回有问题的单个实体的字段。因此,一个典型的查询(实际上除了随机临时查询之外的所有查询)看起来像这样:
SELECT a.* FROM a
JOIN b ON a.id=b.id
JOIN c ON b.id=c.id
JOIN d ON c.id=d.id
JOIN Project p ON d.ProjectID=p.ProjectID
WHERE p.ProjectID = 12345
Run Code Online (Sandbox Code Playgroud)
可以想象,在层次结构中越往下走,查询的性能就越差。我考虑过仅通过在层次结构的所有级别中冗余地保留 ProjectID 字段,并在每个表中的 ProjectID 上创建聚集索引来对一个字段进行非规范化。这将使我能够通过单个索引查找满足所有数据请求。这样做可以显着提高查询性能。但是,我不知道这样做是否会对架构设计的保真度产生负面影响。我希望有人可以为我提供一些见解,以防我遗漏了什么。
我们对客户 id 做类似的事情。是的,如果您不需要在每个查询中遍历所有这些中间表,它可以提高性能。然而,这很重要,只有在您使用永不改变的代理键时才最好这样做。否则,项目 ID 的更改可能需要一系列更新,这些更新会影响每个表并锁定系统。我怀疑 project_id 不太可能像客户 ID(客户名称,现在是另一个故事)一样改变,所以你可能会没事。但是请考虑您是否会对非规范化的字段进行更新,
归档时间: |
|
查看次数: |
1535 次 |
最近记录: |