1

我只是第一次尝试外键,我担心我会有点忘乎所以。

对于我的几个类变量和它们相应的数据库记录,我有一组常量来限制可以选择的值。这些当前使用 PHP 设置和验证。

我想知道的是,我应该在 MySQL 中制作这些常量的表并将它们锁定到外键中吗?这值得麻烦吗,还是 PHP 定义就足够了?


例如,假设我有一个 table transactions,其中定义了 PHP 常量'credit''debit'

transactions有一个type字段指示交易是贷方还是借方。

我应该创建另一个表(transactions_constants或其他东西)来定义其中使用的常量transactions(type)并将它们外键在一起吗?

4

3 回答 3

2

如果您的值集很少更改,则应使用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)

如果您的代码完美,则无法运行上述查询。由你决定。

于 2013-05-23T05:41:46.803 回答
2

是的你应该。使用 FK:

  • 您的数据库有一个更具体的界面。
  • 数据库具有清晰的结构(无论代码如何,数据库都应该是可读的)。
  • 您可以避免其他数据库客户端(如 PMA)的插入/更新事故。

但是您也可以在 PHP 中使用 consts 作为 consts 的表副本(我为此使用代码生成)。

是的,你可以使用枚举。但请先阅读MySQL 的 ENUM 数据类型邪恶的 8 个原因

于 2013-05-23T05:12:10.780 回答
2

在您的情况下,为事务类型创建一个单独的表可能是矫枉过正。您可以将type列设为枚举,以帮助限制数据库端允许的值。

如果事务类型有更多与它们相关联的数据并且您想存储在数据库中,那么单独的表和外键关系将是可行的方法。

于 2013-05-23T05:31:48.610 回答