【发布时间】:2013-10-15 00:59:11
【问题描述】:
假设我在数据库中有很多表包含 numeric id,例如user_type、user_status、user_currency 等字段
现在我必须在我的网站页面上显示此信息以及其他信息,比如我有 10 个页面将打印上述一些信息
方法一 当我写查询时,我会做类似的事情
SELECT ...
user_status
...
FROM users
WHERE user_id = 5
然后我传递给模板语言,我使用 Smarty v3
然后在页面模板内我做类似的事情
{section ...}
...
{if $users[0].user_status == 1}
New User
{elseif $users[0].user_status == 2}
Application Accepted
{elseif $users[0].user_status == 3}
Payment received
{/if}
...
{/section}
所以相同的代码基本上会进入 10 个不同的页面,当我更改某些内容或添加新的状态、货币等时,我必须转到每个页面并将其添加到 if 语句中
我认为这种方法非常不可靠且耗时
方法 2 所以我开始这样做我创建另一个带有用户状态的表,例如tbl_user_statuseds
user_status_id status_name
1 New User
2 Application Accepted
3 Payment received
...
然后在每个页面的主查询中我做这样的事情
SELECT ...
tbl_user_statuseds.status_name
...
FROM users
LEFT JOIN tbl_user_statuseds ON tbl_user_statuseds.user_status_id = users.user_status
WHERE user_id = 5
在页面中我只使用{$users[0].status_name},如果我添加新状态,这将在每个页面上进行编辑。只需在数据库表状态中添加新行一次
但是使用第二种方法,我现在在数据库中有大约 10 个表,其中仅包含数字 id 描述 tbl_user_statuseds、tbl_currency_names、tbl_user_sex 等。
方法 3 我想知道使用一次表来存储这个ID是一个好习惯吗? 例如
tbl_id_labels
id id_type id_number id_label
421 2 1 New User
422 2 2 Application Accepted
423 2 3 Payment received
424 8 1 USD
425 8 2 EURO
426 5 1 Male
427 5 2 Female
...
然后我只做与方法 2 相同的操作,只是我根据 id_number 离开加入此表,例如
SELECT ...
tbl_id_labels.status_name
...
FROM users
LEFT JOIN tbl_id_labels ON tbl_id_labels.id_number = users.user_status AND tbl_id_labels.id_type = 2
WHERE user_id = 5
这样我只有一个表,其中包含我系统中所有数字 ID 的标签。 如果将来我必须添加一个,它并不太难,所有重要的是 id_type 和 id_number,字段 id 只是为了兼容。
您认为第三种方法有什么问题吗,或者您能建议更好的方法吗?
【问题讨论】:
标签: php mysql smarty organized