Ran*_*ash 12 mysql database database-design foreign-keys relational-database
一个问题:
我有2张桌子:
Product
id INT
name VARCHAR(64)
something TEXT
else INT
entirely BOOL
Run Code Online (Sandbox Code Playgroud)
和
Ingredient
id INT
name VARCHAR(64)
description TEXT
Run Code Online (Sandbox Code Playgroud)
现在我还有一个链接表
Products_Ingredients
product_id INT
ingredient_id INT
Run Code Online (Sandbox Code Playgroud)
为了我的多对多关系.
现在,产品和配料都有独特的名称.所以我可以使用名称作为自然键...但这是一个好主意吗?
说我有一个产品:Paint Thinner Supreme
含有成分:Butylonitrotetrocycline
将这些名称用作链接表中的复合键是否是一个好主意?
尽管我理解在代理人之上使用自然键背后的想法,我有点不能不再认为使用简单整数作为主键(和外键)会更快.MySQL服务器消化这些不同密钥的方式会有区别吗?
你有什么意见?
Mik*_*ll' 17
当你可以衡量时,意见无关紧要.
我使用自然键和代理项在PostgreSQL上实现了这一点.我使用了300,000个总产品,180种成分,并填充了两个"产品成分"表,每种产品含有3到17种成分,100,000种随机选择的产品(1053462行).
使用自然键选择单个产品的所有成分,返回0.067毫秒.使用代理,0.199ms.
使用在0.145毫秒内返回的自然键返回单个产品的所有非id列.使用代理,0.222毫秒
因此,自然键在此数据集上的速度提高了约2至3倍.
自然键不需要任何连接来返回此数据.代理键需要两个连接.
实际的性能差异取决于表的宽度,行数,页面大小和名称长度等.代理键的开始优于自然键,但很少有人试图测量它.
当我为我的雇主的操作数据库设计数据库时,我构建了一个带有围绕自然键设计的表的测试平台,以及围绕id编号设计的表.这两种模式都有超过1300万行计算机生成的样本数据.在少数情况下,对id号架构的查询优于自然键架构50%.(因此,使用自然密钥,使用id号花费20秒的复杂查询需要30秒.)但是,80%的测试查询对自然密钥模式具有更快的SELECT性能.有时它的速度要快得多 - 相差30比1.
我们希望自然密钥在未来几年内在我们的数据库中优于代理.(除非我们将某些表移到SSD上,否则自然键可能会永远超越代理.)
| 归档时间: |
|
| 查看次数: |
2934 次 |
| 最近记录: |