Php 值列表:代码常量还是数据库?

Php 值列表:代码常量还是数据库?,php,database,key-value-store,Php,Database,Key Value Store,我想知道是否有价值清单管理的良好实践。 例如,我有一个数据库表日志,如下所示: --------------- | logs | |-------------| | id | | idLogType | | message | | date | --------------- 2.只有数据库? 你觉得这三种方法怎么样?或多或少是非结构化的想法: 您不应该在代码或数据库中使用幻数。因此,应避免使用日志类型“1”、“2”等 您应该在PHP代

我想知道是否有价值清单管理的良好实践。 例如,我有一个数据库表日志,如下所示:

--------------- | logs | |-------------| | id | | idLogType | | message | | date | --------------- 2.只有数据库?
你觉得这三种方法怎么样?

或多或少是非结构化的想法:

  • 您不应该在代码或数据库中使用幻数。因此,应避免使用日志类型“1”、“2”等
  • 您应该在PHP代码中使用常量,我将为这些常量提供有意义的字符串值,而不是数值
  • 这些字符串值可以直接用作数据库中的
    logType
  • 因此,对
    logType
    列使用
    ENUM
    也非常有意义。如果要添加日志类型,则需要更改表。。。那又怎么样?这并不是经常发生的事情,无论如何,您都需要修改代码来添加一个新的常量,并且您应该准备好模式迁移代码,这使得添加一个新的SQL枚举值变得很简单
因此,对我来说,这似乎是最好的解决方案:

  • 常量,如
    LogTypeValues::CREATION='CREATION'
  • logType
    类型的列
    ENUM('creation',…)
  • 用于处理日志类型添加的架构迁移

这是一个很好的问题——理性的人会有不同的观点,这取决于你对“好”的定义

选项1使PHP可以很好地工作,但这意味着当您想要查询日志时,需要在两个位置设置常量——通常,日志查看器与日志编写器不是同一个应用程序。您必须编写一些自定义逻辑来将数据库中的整数转换为人类可读的字符串。如果有多个应用程序写入日志数据库,那么保持它们之间的常量同步就变得非常重要—如果应用程序1认为是logType 1=“User error”,而应用程序2认为是“system error”,那么整个过程就会分崩离析

选项2面临着相反的问题——PHP代码如何“知道”数据库认为logType 1是“用户错误”?您肯定不希望在PHP代码库中有神奇的数字

选项3名义上使两个系统保持同步,但现在必须找到一种方法将数据库与PHP常量文件同步。有各种各样的逻辑路线可以做到这一点,但没有一条是琐碎的


由于我懒散且偏执于bug的蔓延,我通常不使用整数——相反,PHP代码从常量文件向数据库写入表示日志类型的字符串

我最喜欢的解决方案是:

在数据库中存储日志类型:

CREATE TABLE logTypes (
    id (SMALLINT, PK)
    code VARCHAR(32) UNIQUE    
) 
在代码中创建常量

class logTypes {
    const CREATE_USER = 1;
    const EDIT_USER = 2;
    ...
}
并选择一个同步策略:

  • 从DB=>创建logTypes类代码是“DB的缓存”,如果未生成缓存,项目将无法工作
  • 从代码创建数据库=>数据库仅用于sql报告和将sql功能应用于日志类型搜索等
例如:

SELECT * FROM logs JOIN logTypes USING logtype_id WHERE logType LIKE "% CREATION"

我也有过类似的经历。显然,上面提到的所有这些选择都有利弊,我也没有做出决定。这就是我找到这条线的原因

到目前为止,我的首选方法是使用选项1,即仅在应用程序的源代码(PHP/Java等)中存储常量。它的主要优点是减少不必要的DB点击。虽然有些人可能会说它非常小,但DB连接通常是许多web应用程序的瓶颈。另一个优点是它降低了编程的复杂性


除了本线程中提到的内容之外,我所做的唯一一件事就是在应用程序源代码和相关DB表列中的注释中添加注释,以便相互交叉引用。通过这种方式,我尽我所能提醒未来的开发人员,如果发生任何更改,请同步这两个位置

感谢您的回答,但请小心,包含日志的表可能是数据库中最大的表之一,存储varchar(1字节+1字节/char)而不是tinyint(仅1字节)可能是一个问题,因为将字符串存储在数据库中,它甚至不会在我认为绝对不可接受的数据库中。 ------------ | logTypes | ------------ | id | | logType | ------------
class LogTypeValues {
  const LOGTYPE_CREATION = 1;
  const LOGTYPE_EDITION  = 2;
  const LOGTYPE_DELETION = 3;
}
CREATE TABLE logTypes (
    id (SMALLINT, PK)
    code VARCHAR(32) UNIQUE    
) 
class logTypes {
    const CREATE_USER = 1;
    const EDIT_USER = 2;
    ...
}
SELECT * FROM logs JOIN logTypes USING logtype_id WHERE logType LIKE "% CREATION"