1

在我的 Mysql 数据库中,我有一个Person表,其中有一个名为FirstName.

如果有 10000 个条目,有时会有FirstNames诸如JohnBob等之类的普通人的重复。

如何编辑Person表以仅存储重复一次,以便我可以利用内存空间并更有效地存储数据?

4

2 回答 2

2

您正在寻找一种极端形式的标准化,我将其归类为微优化。我知道的大多数数据库都没有走那么远,但毕竟不是。

这可以通过创建一个firstname包含数据库中所有已知名字的表来简单地实现。然后将firstname主表中的列替换为对该表的外键引用(通常为 4-byte INT)。

这种方法的问题是您还将在 上创建一个索引firstname,它看起来像这样:

CREATE TABLE fistnames (
    id INT PRIMARY KEY,
    firstname VARCHAR(250)
) ;

此表的占用空间将为 4(firstnames.id列)+ [长度firstname] + [主键索引条目的大小]。还要在主表中为外键添加另外 4 个字节。这在存储方面可能比您当前的结构效率低,尤其是对于那些短名称,例如“Joe”。

于 2013-08-14T09:43:17.787 回答
1

而不是有 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; 
于 2013-08-14T09:42:53.550 回答