值列表:代码常量或数据库?

ben*_*lal 12 php database key-value-store

我想知道价值管理清单是否有良好的做法.例如,我有一个数据库表日志如下:

---------------
| logs        |
|-------------|
| id          |
| idLogType   |
| message     |
| date        |
---------------

我的问题是关于字段"idLogType".我知道枚举不是处理这种字段的好方法,因为如果我想添加新值,我必须改变表格.所以我要创建一个值列表.

你有什么建议来处理价值观?

1.只有PHP常量?

class LogTypeValues {
  const LOGTYPE_CREATION = 1;
  const LOGTYPE_EDITION  = 2;
  const LOGTYPE_DELETION = 3;

  private $_logTypes = array();

  public function __construct() {
    $this->_logTypes[self::LOGTYPE_CREATION] = "Creation";
    $this->_logTypes[self::LOGTYPE_EDITION]  = "Edition";
    $this->_logTypes[self::LOGTYPE_DELETION] = "Deletion";
  }

  public function getId($logType) { ... }
  public function getLogType($id) { ... }
}

$request = $pdo->prepare('INSERT INTO logs SET idLogType = :idLogType, ...');
$request->execute(array('idLogType' => LogTypeValues::LOGTYPE_CREATION));
Run Code Online (Sandbox Code Playgroud)

2.只有数据库吗?

------------
| logTypes |
------------
| id       |
| logType  |
------------
<?php
$request = $pdo->prepare('INSERT INTO logs SET idLogType = 1, ...');
$request->execute(array());
Run Code Online (Sandbox Code Playgroud)

3.在数据库中还有PHP常量?

------------
| logTypes |
------------
| id       |
| logType  |
------------
class LogTypeValues {
  const LOGTYPE_CREATION = 1;
  const LOGTYPE_EDITION  = 2;
  const LOGTYPE_DELETION = 3;
}
Run Code Online (Sandbox Code Playgroud)

你对这三种方法有什么看法?

nem*_*ems 5

我最喜欢的解决方案是:

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

CREATE TABLE logTypes (
    id (SMALLINT, PK)
    code VARCHAR(32) UNIQUE    
) 
Run Code Online (Sandbox Code Playgroud)

在代码中创建常量

class logTypes {
    const CREATE_USER = 1;
    const EDIT_USER = 2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

并选择同步策略:

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

例子:

SELECT * FROM logs JOIN logTypes USING logtype_id WHERE logType LIKE "% CREATION"
Run Code Online (Sandbox Code Playgroud)