我有一张禁令原因表:
id | short_name | description
1 virus Virus detected in file
2 spam Spammy file
3 illegal Illegal content
当我禁止文件成为病毒时,在我的代码中我这样做:
$file -> banVirus();
将文件ID和禁止原因插入表中:
"INSERT INTO 'banned_files' VALUES (61234, 1)"
我的问题是; 是否存在问题,我将值1?硬编码,以表示垃圾邮件文件。
我应该在我的配置中使用定义,例如define('SPAM',1),所以我可以用define替换1吗?或者根本不重要?
答案 0 :(得分:2)
如果id
是自动递增字段,那么这是非常大的问题!由于ID是自动生成的,因此很难保证它们的稳定性;即他们可能会改变。
如果id
是你手动分配的东西,那不是一个大问题,但这是不好的做法。因为魔法数字很容易导致混乱和错误。谁知道“1
”在阅读代码时的含义?
无论哪种方式,最好为每种情况分配稳定,可读 ID。
我同意@Tenner的说法,开始使用这个静态,不变的数据表也几乎没有意义。您的banned_files
表应该有一个这样的列:
reason ENUM('virus', 'spam', 'illegal') NOT NULL
您的数据库中不需要任何其他内容。为用户输出时,可以通过PHP代码添加一个简单数组的可读原因。
答案 1 :(得分:1)
由于你有一个固定(和小)的参数,我很想让你的代码中的ID成为一个枚举,甚至根本不包括它们作为一个单独的数据库表。
想想像性别这样的东西 - 它有两个(或更多)选项,都是固定的。 (我们不会很快添加多个新性别。)我保证大多数注册系统都没有包含两个条目的GENDER表。
因此,表banned_files
将是这样的:
id | reason
--------+------------
12345 | 1
67890 | 2
并且您的代码将根据需要包含枚举:
enum BanReason {
Virus = 1,
Spam = 2,
Illegal = 3
}
(请转换为PHP;我是C#开发人员!)
在PHP中:
$aBanReason = array(
'Virus' => 1,
'Spam' => 2,
'Illegal' => 3
);