Dav*_*ave 9 mysql sql foreign-keys
我知道这是超基本的,但这是我一直持有的假设,并且想验证它是否属实(通常,具体针对各种实现的细节)
假设我有一个包含文本列"Fruit"的表.在该专栏中,只出现了四个值中的一个:梨,苹果,香蕉和草莓.我有一百万行.
如果我将它提取到另一个具有Fruit列且只有那四行的表中,然后将原始列作为外键,那么它是否可以节省空间,而不是每次重复该数据(平均)25万次?
我假设四个水果名称只存储一次,而百万行现在有指针或索引或某种引用到第二个表中.
如果我的行值比短水果名称长,我认为节省/优化甚至更大.
外键关系两侧的字段的数据类型必须相同.
如果父表的键字段是(例如)varchar(20)
,那么依赖表中的外键字段也必须是varchar(20)
.这意味着,是的,你必须在每张桌子上重复X万行的'Apple'和'Pear'和'Banana',其外键指向水果桌.
通常,使用数字字段作为键(int,bigint)更有效,因为那些可以用很少的CPU指令进行比较(通常可以直接进行一次cpu指令比较).另一方面,字符串需要循环和相对昂贵的设置.所以,是的,最好将水果名称存储在某个表格中,并使用相关的数字ID字段作为外键.
当然,您应该对两种设置进行基准测试.这些只是一般的拇指规则,您的特定要求/设置实际上可以使用字符串作为键版本更快地工作.
那是正确的.
你应该有
table fruits
id name
1 Pear
2 Apple
3 Banana
4 Strawberry
Run Code Online (Sandbox Code Playgroud)
ID是主键的位置.在第二个表中,您将只使用此表的id.这将节省您的物理空间,并使您的选择语句更快地运行.
此外,这种结构使您可以轻松添加新水果.