2010-04-27 66 views
0

一些提示,我打算创建一个表来存储竞赛结果是这样的:需要在创建表

Place RaceNumber  Gender   Name     Result  
12  0112    Male  Mike Lee   1:32:40 
16  0117    Female Rose Mary   2:20:40 

我感到困惑的项目类型定义。

  1. 我不知道该result可以设置为varchar(32)或其他类型的?

  2. racenumberint(11)varchar(11)之间,哪一个更好?

  3. 我可以像我一样使用UNIQUE KEY吗?

  4. 我需要在我的数据库表中拆分namefirstnamelastName吗?

DROP TABLE IF EXISTS `race_result`; 
CREATE TABLE IF NOT EXISTS `race_result` (
    `id` int(11) NOT NULL auto_increment, 
    `place` int(11) NOT NULL, 
    `racenumber` int(11) NOT NULL, 
    `gender` enum('male','female') NOT NULL, 
    `name` varchar(16) NOT NULL, 
    `result` varchar(32) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `racenumber` (`racenumber`,`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; 

回答

2

有关数据类型的几点建议/意见。

结果 - 这是一个时间,你可能想在这段时间做一些计算,因此你应该把它作为时间类型来存储。

RaceNumber - 这是一个参考,虽然它是一个数字,但您将不对这个数字进行计算。所以你应该把它作为一个varchar而不是一个int来存储。这将避免混淆它的使用,并避免意外操纵它作为一个数字。

名称 - 查看允许名称的字符串长度。小心限制这个值。未来某些名称可能会有16个字符太小。

地方 - 这是需要存储?你能根据他们的成绩单独计算一个跑步者的位置吗?但是,你应该为你的桌子保留一个好的主键。

+0

+1,但我可能会将'RaceNumber'存储为'CHAR(4)NOT NULL CHARSET latin1'。 – newtover 2010-04-27 08:58:22

1

在回答您的具体问题:

结果:我会的结果正好被设置为秒的整数倍。我的意见是数据应该存储在数据库中,而不是格式化。由于你想要做的事情可能会按照它排序并返回小于或大于特定值的行,所以对我来说整数看起来更好。

比赛编号:相同的比赛编号。如果它始终是数字,则使用整数并担心应用程序中的格式。如果它可以是非数字的,那么通过所有的手段使它变成varchar,但是对于一个数值,我看不到足够的收益。

独特的关键:我并没有真正看到在比赛号和ID上拥有唯一索引的观点。根据定义,ID作为主键已经是唯一的。也许你的意思是比赛号码和地点,尽管如果两个人为一个地方进行抽签,那么这样做也是有风险的。

拆分名称:如果您打算将它们视为单个值,那么是的。否则不。换句话说,避免像where fullname like 'Mike %'这样的事情。

1

对于名称,如果您想要在lastname上进行排序,而将其显示为“firstname lastname”,则需要使用单独的列。

一般来说:想想你想要做什么与数据。将格式留给显示数据的应用程序。避免出现需要字符串操作或复杂数学来获取所需值的情况。