我打算创建一个表来存储比赛结果,如下所示:
Place RaceNumber Gender Name Result
12 0112 Male Mike Lee 1:32:40
16 0117 Female Rose Mary 2:20:40
我对项目类型定义感到困惑。
我不确定result
是否可以设置为varchar(32)
或其他类型?
和racenumber
,在int(11)
和varchar(11)
之间哪个更好?
我可以像我一样使用UNIQUE KEY
吗?
我是否需要在数据库表格中将name
拆分为firstname
和lastName
?
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;
答案 0 :(得分:2)
关于数据类型的一些建议/意见。
结果 - 这是一段时间,您可能希望在此时进行一些计算,因此您应将其存储为时间类型。
RaceNumber - 这是一个引用,虽然它是一个数字,但您不会对此数字执行任何计算。因此,您应该将其存储为varchar而不是int。这样可以避免对其使用造成混淆,并避免将其作为一个数字意外地操纵。
名称 - 查看您允许使用的字符串长度。要小心限制这个值。对于某些名称,未来16个字符可能太小。
地点 - 这是否需要存储空间?你能根据他们的结果单独算出跑步者的位置吗?但是,你应该为你的桌子保留一个好的主键。
答案 1 :(得分:1)
回答您的具体问题:
结果:我只想将结果设置为整数秒。我的观点是数据应该存储在数据库中,而不是格式化。由于您可能想要做的事情是按它排序并返回小于或大于它的特定值的行,所以对我来说整数似乎更好。
比赛号码:比赛号码相同。如果它始终是数字,请使用整数并担心应用程序中的格式。如果它可以是非数字的,那么无论如何都要使它成为varchar但是,对于数值,我看不到足够的增益来实现它。
唯一关键:我真的没有看到在比赛号码和ID上有唯一索引的重点。根据定义,ID已经是唯一的主键。也许你的意思是比赛号码和地点,尽管如果有两个人为一个地方画画,那就更有风险了。
拆分名称:如果您打算将它们视为个别值,那么是。否则没有。换句话说,请避免使用where fullname like 'Mike %'
。
答案 2 :(得分:1)
对于名称,如果您想对姓氏进行排序,当您将其显示为“firstname lastname”时,则需要使用单独的列。
一般来说:考虑一下你想对数据做些什么。将格式保留给显示数据的应用程序。避免需要字符串操作或复杂数学来获得所需值的情况。