大型数据库的优化设计

Mat*_*att 3 performance database-design query-performance

全新的数据库,在 linux 上使用 postgresql。我已经对这个问题进行了大量阅读,并在这里浏览了类似的问题,但只是想确认组织一切的最有效方式。

例如,假设我们有一百万人的条目,每个人都有姓名、电话号码、地址和 20 到 50 个“技能”。正确的方法是拥有一个包含基本人员属性和唯一标识符的表,然后创建另一个包含两列包含人员 ID 和技能名称的表吗?

对我来说似乎有点多余,但在人员表中具有可变数量的技能列的另一种选择似乎更糟。

有什么技巧可以最大限度地提高速度并最大限度地减少内存使用量?

Vér*_*ace 7

这是您使用“连接表”的经典情况。

您将需要三张桌子。

Person
Skill
Person_Skill
Run Code Online (Sandbox Code Playgroud)

(请注意,表名是单数 - 这是我的偏好,而不是规则)。

Person
ID integer PRIMARY KEY
<other person details - name, address, phone &c.>
KEY name (and possibly phone?)

Skill
ID integer PRIMARY KEY
<other skill details - name, description, necessary qualification &c.>
KEY name (maybe not even necessary if there are only 50 skills?)    

Person_Skill
Person_ID integer FOREIGN KEY REFERENCES Person(ID)
Skill_ID integer FOREIGN KEY REFERENCES Skill(ID)
Unique Index on (Person_ID, Skill_ID) (to avoid duplicates)
KEY Skill_ID
Run Code Online (Sandbox Code Playgroud)

这样你就不会存储技能名称、描述等。对于拥有该技能的每个人,但只需一次,然后在Person_Skill表中通过它引用它ID- 这减少了空间和内存要求并且更不容易出错(您只存储一次技能数据 - RDBMS 的核心功能之一根据科德的规则)。

这就是我会这样做的方式。