在我的 Mysql 数据库中,我有一个Person
表,其中有一个名为FirstName
.
如果有 10000 个条目,有时会有FirstNames
诸如John
或Bob
等之类的普通人的重复。
如何编辑Person
表以仅存储重复一次,以便我可以利用内存空间并更有效地存储数据?
在我的 Mysql 数据库中,我有一个Person
表,其中有一个名为FirstName
.
如果有 10000 个条目,有时会有FirstNames
诸如John
或Bob
等之类的普通人的重复。
如何编辑Person
表以仅存储重复一次,以便我可以利用内存空间并更有效地存储数据?
您正在寻找一种极端形式的标准化,我将其归类为微优化。我知道的大多数数据库都没有走那么远,但毕竟不是。
这可以通过创建一个firstname
包含数据库中所有已知名字的表来简单地实现。然后将firstname
主表中的列替换为对该表的外键引用(通常为 4-byte INT
)。
这种方法的问题是您还将在 上创建一个索引firstname
,它看起来像这样:
CREATE TABLE fistnames (
id INT PRIMARY KEY,
firstname VARCHAR(250)
) ;
此表的占用空间将为 4(firstnames.id
列)+ [长度firstname
] + [主键索引条目的大小]。还要在主表中为外键添加另外 4 个字节。这在存储方面可能比您当前的结构效率低,尤其是对于那些短名称,例如“Joe”。
而不是有 key on FirstName
,你应该有 id 作为 key。FirstName
还要从列中删除任何键。
你应该从memory versus functionality and speed
. 如果你想通过在FirstName
列上设置一个键来节省内存,你将不得不牺牲让多个人同名的功能。
您应该在表中添加一个id
带有主键的列person
。
根据您的要求,我给您提供人员表模板
CREATE TABLE persons
(id int auto_increment primary key,
FirstName varchar(40),
LastName varchar(40),
details varchar(100),
...any other columns
)
如果您之前没有该id
字段,请使用
ALTER TABLE persons ADD id int auto_increment primary key;