我只是第一次尝试外键,我担心我有点忘乎所以。
对于我的几个类变量和它们对应的数据库记录,我有一组常数来限制可以选择的值。
我想知道的是,我应该在MySQL中制作这些常量的表并将它们锁定到外键中吗?这样做值得吗?或者PHP定义足够了吗?
例如,假设我有一个表transactions
,其中为'credit'
和'debit'
定义了PHP常量。
transactions
有一个type
字段,该字段指示交易是贷方还是贷方。
我应该创建另一个表(transactions_constants
或其他)来定义transactions(type)
和外键中使用的常量吗?
是的,你应该。颗:
- 你的数据库有一个更具体的接口
- 数据库有一个清晰的结构(一个数据库应该是可读的,不管代码)。
- 可以避免其他数据库客户端(如PMA)插入/更新的意外。
但是你也可以在PHP中复制带有const的表作为const(我使用codedegeneration)。
是的,你可以使用enum。但请先阅读MySQL的ENUM数据类型是邪恶的8个原因。
在您的示例中,为事务类型创建单独的表可能有些多余。您可以将type
列设置为enum,以帮助限制数据库端允许的值。
如果事务类型有更多与它们相关的数据,那么您希望存储在数据库中,那么单独的表和外键关系将是一种方法。
如果你的值设置很少改变,你应该使用MySQL ENUM数据类型,并且你应该打开MySQL限制模式。例如:
如果你的表是这样的:
CREATE TABLE `table` (
id int unsigned primary key auto_increment,
type enum('credit','debit') not null,
);
当你执行像
这样的查询时,严格模式将会帮助你。
update table `table` set `type` = 'credit1 ' where id = 2
# strict mode on: an error will be raised
# strict mode off: `type` will be '' (empty string)
如果你的代码是完美的,上面的查询不能运行。