关于外键数据如何存储在SQL中的问题

Dav*_*ave 9 mysql sql foreign-keys

我知道这是超基本的,但这是我一直持有的假设,并且想验证它是否属实(通常,具体针对各种实现的细节)

假设我有一个包含文本列"Fruit"的表.在该专栏中,只出现了四个值中的一个:梨,苹果,香蕉和草莓.我有一百万行.

如果我将它提取到另一个具有Fruit列且只有那四行的表中,然后将原始列作为外键,那么它是否可以节省空间,而不是每次重复该数据(平均)25万次?

我假设四个水果名称只存储一次,而百万行现在有指针或索引或某种引用到第二个表中.

如果我的行值比短水果名称长,我认为节省/优化甚至更大.

Mar*_*c B 6

外键关系两侧的字段的数据类型必须相同.

如果父表的键字段是(例如)varchar(20),那么依赖表中的外键字段也必须是varchar(20).这意味着,是的,你必须在每张桌子上重复X万行的'Apple'和'Pear'和'Banana',其外键指向水果桌.

通常,使用数字字段作为键(int,bigint)更有效,因为那些可以用很少的CPU指令进行比较(通常可以直接进行一次cpu指令比较).另一方面,字符串需要循环和相对昂贵的设置.所以,是的,最好将水果名称存储在某个表格中,并使用相关的数字ID字段作为外键.

当然,您应该对两种设置进行基准测试.这些只是一般的拇指规则,您的特定要求/设置实际上可以使用字符串作为键版本更快地工作.

  • 我不会将 mysql 的数据存储实践与编程语言进行比较。仅存储一份副本是有意义的,但外键不是引用。它们只是一个像任何其他字段一样的字段,恰好包含与另一个表中的等效字段/数据匹配的数据。毕竟,在大表上删除外键几乎是瞬时的。如果它是一个引用,那么既然引用已经消失,DBMS 就必须复制真实数据。 (2认同)

And*_*rey 5

那是正确的.

你应该有

table fruits
id   name
1    Pear
2    Apple
3    Banana
4    Strawberry
Run Code Online (Sandbox Code Playgroud)

ID是主键的位置.在第二个表中,您将只使用此表的id.这将节省您的物理空间,并使您的选择语句更快地运行.
此外,这种结构使您可以轻松添加新水果.