表的规范化

时间:2011-10-21 06:18:46

标签: mysql vb.net normalization database-normalization

我正在尝试使用VB.Net和MySQL为其数据库创建一个简单的注册程序。这是我用于基本信息的简单表格

enter image description here

但是,我试图提高我对表格规范化的基本知识,这就是为什么我将日期字段分开以避免,比如说在一天内重复插入同一日期。我的意思是,当50个人在一天内注册时,它只会在tblRegDate表中添加一个日期(记录),而不是在表中添加50次。有没有办法做到这一点?在VB.Net和MySQL中有可能吗?或者更确切地说,我应该添加或修改某些字段吗?或者我应该在VB.Net中提出一个条件?上面的表格是我朋友教给我的,但我发现它并没有消除冗余。请给我任何指导或指导我到网站,其中有一个简单的教程。提前谢谢!

这是我的MySQL代码:

CREATE TABLE tblInfo(
       Number INT AUTO_INCREMENT,
       LastName VARCHAR(45),
       FirstName VARCHAR(45),
       MiddleName VARCHAR(45),
       Gender ENUM(M,F),
       BirthDate DATE,
       PRIMARY KEY(Number));

CREATE TABLE tblRegDate(
       IDRegDate INT AUTO_INCREMENT,
       Date TIMESTAMP,
       Number INT,
       PRIMARY KEY(IDRegDate),
       FOREIGN KEY(Number) REFERENCES tblInfo(Number));

3 个答案:

答案 0 :(得分:2)

正如我在这种情况下所看到的那样,你没有分离单个领域的优势。你会失去很多表现。

表规范化与没有任何冗余值无关。它更多的是“分离关注点”

同样重要的是不要在数据库中出现爆炸性复杂性。分离单个填充将最终存储在数据库中,没有人能够理解。

问题是:注册有更多信息吗?对于示例网页,IP,.....

你应该有两个表,例如“人”和“注册”。那么你将有两个语义不同的东西,不应该混淆。

您可以通过Google找到很多示例和信息。和维基百科 http://en.wikipedia.org/wiki/Database_normalization

答案 1 :(得分:1)

实际上,从表中分离时间戳并不是一个好主意。
你需要另一张表,即timeTable。它将有两列id和timestmap,您应该在tblRegDate表中将此id作为外键引用。 外键是一个整数,大小为4个字节。另一方面,日期为3个字节。

因此,我建议您在tblRegDate中保留日期,而不是在额外的表格中

答案 2 :(得分:1)

规范化数据库结构时,请始终注意ACID - http://en.wikipedia.org/wiki/ACID

根据您拥有的字段,您应该将其保留为单个表格。分开注册日期不是一个好的设计,因为你每次都要查看。在现实生活中,如果您的应用始终按照regdate搜索或排序,则可以考虑索引注册日期。

如果您将FK RegDate表添加到用户表,那么它也无效率。

P.S。另请注意,有4个级别的数据库规范化。如果您不熟悉数据库设计,则应考虑学习如何将数据库设计从第1个移到第2个,以及第2个到第3个常规形式。

我们很少在现实生活中使用第4范式。交易系统通常在大多数时间保持在第3位。

希望有意义。