【发布时间】:2011-04-01 04:34:18
【问题描述】:
嗯,这是一个简单的设计问题,我想了很多次,但从未找到令人满意的解决方案。我的例子是 php-sql,但这当然也适用于其他语言。
我有一个只包含很少条目的小型数据库表,而且几乎不需要更新。例如这个usertype 表:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
现在在 php 代码中,我经常需要检查或比较我正在处理的用户类型。由于用户类型存储在数据库中,我可以:
1) 在类实例化时从用户类型表中选择 *,并将其存储在一个数组中。
然后所有的 id 都可用于代码,我可以做一个简单的选择来获取我需要的行。每次实例化类时,此解决方案都需要一个数组和一个 db 查询。
$query = "SELECT info, foo FROM user WHERE usertype_id = ".$usertypes['admin'];
2) 使用name 列选择正确的usertype_id,这样我们就可以有效地与其他表连接。这或多或少等同于 1) 但不需要在 php 对象中缓存整个 usertype 表:
$query = "SELECT info, foo FROM user JOIN usertype USING (usertype_id) WHERE usertype.name = 'admin' ";
3) 定义与用户类型表中的键匹配的常量:
// As defines
define("USERTYPE_ADMIN",1);
define("USERTYPE_REGUSER",2);
//Or as class constants
const USERTYPE_ADMIN = 1;
const USERTYPE_REGUSER = 2;
然后做一个简单的选择。
$query = "SELECT info, foo FROM user WHERE usertype_id = " . USERTYPE_ADMIN;
这可能是最节省资源的解决方案,但维护起来很糟糕,因为如果您需要修改 usertype 表中的某些内容,则必须同时更新表和代码。..
4) 废弃usertype 表,只保留php 代码中的类型。我真的不喜欢这样,因为它允许任何值进入数据库并分配给用户类型。但也许,考虑到所有的事情,它并没有那么糟糕,我只是把应该简单的事情复杂化了..
无论如何,总而言之,我最喜欢的解决方案是#2,因为它是连贯的并且在usertype.name 上有一个索引,它不会那么糟糕。但我经常使用的是#3,以提高效率。
你会怎么做?有更好的解决方案吗?
(编辑:#2 中的固定查询)
【问题讨论】:
标签: php design-patterns database-design