在C语言中,编译器会为"字符串"
分配数字ID(4字节指针),并且只保留每个字符串的一份拷贝:对于char *a="Hello", *b="Hello";
,内存中只存储"Hello"
的一个副本。这完全是自动的,对用户透明。
我的问题是,MySQL是否能够做到同样的事情,即自动透明地去重字符串。
理想情况下,我希望它成为数据库的内部存储机制,以便于(如C语言),对于用户而言,数据库看起来和表现得就好像它包含实际的字符串,而在实现上,它只包含指针。
在我的数据库中有很多重复的字符串,例如:
`unit`, `building`, `office`, `firstName`, `lastName`
Chicago main production unit | headquarters | accounting | Jane | Smith
Chicago main production unit | office | sales | Jane | Dow
Miami administrative department | headquarters | sales | Mary | Smith
Miami administrative department | office | accounting | Mary | Dow
等等。例如,像'迈阿密行政部门'
、'会计'
或'史密斯'
这样的字符串在不同的记录中重复出现。
这会增加数据库的大小,以至于我会遇到托管限制。
一个显而易见的解决方案是数据规范化:为名称保留单独的表。
`id`, `string`
1 | Chicago main production unit
2 | Miami administrative department
3 | headquarters
4 | accounting
5 | Jane
6 | Smith
7 | office
8 | sales
9 | Dow
然后,将我的表格设置为
`unit_id`, `building_id`, `office_id`, `firstName_id`, `lastName_id`
1 | 3 | 4 | 5 | 6
1 | 7 | 8 | 5 | 9
并且翻译所有输入和输出的字符串。但是,这样做非常麻烦。
我的问题是MySQL是否可以自动透明地为用户执行此操作:每当我插入一行时,它会自动更新字符串表,并仅在表中存储ID而不是字符串,删除、WHERE等也是如此,以便于用户看起来,该表与具有字符串的表完全相同,但占用更少的空间。