【问题标题】:How to organize storage of descriptions for dropdowns list items如何组织下拉列表项的描述存储
【发布时间】: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


    【解决方案1】:

    方法1显然不方便支持,所以不建议使用

    方法2是不错的选择,只是不要使用LEFT JOIN,INNER 更好

    方法3不是很好的选择,因为性能原因,所以我建议第二个

    另外,想想 - 为什么需要在数据库中存储常量数据?创建 10 个 php 函数,它们将使用简单的开关/数组来输出 ID 的标题? - 这将是最快的方法

    【讨论】:

    • 我不认为第三种方法会滞后数据库,只要我为列 id_type 和 id_number 创建索引,我在任何时候都看不到表的总大小超过几百条记录。我喜欢用 PHP 方法存储字段名称,你能给我举个例子吗?
    • 第二个选项会比第三个更快,这就是我写性能的原因,下一期关于示例:就像函数:function getStatusForId($id) { switch...} 和模板中的 echo getStatusForId($users[0].user_status)
    • 实际上我更喜欢方法 3,即使它有点慢,或者两种,因为这样你可以在管理界面中创建页面,最终用户(客户端)可以重命名状态或添加新状态。我的意思当然是如果他编辑删除新状态它将破坏程序,但我也相信可以以所有物流(用户或系统的进程)可以在数据库表中定义而不是 php 的方式创建程序
    • 您可以在不同的服务器上为不同的目的创建两个或三个数据库,这样就不会降低网站速度。
    • 说一个表是用户信息另一个表是用户文档第三个表设置前两个表之间的关系,第四个表设置过程在用户过程中需要收集的文件等。它就像乐高一样当然它不是 100% 在数据库中完成的,有些东西你仍然需要在 php 中编码,但我认为逻辑应该尽可能地在数据库中,这使得网站更具可重用性和通用性。就像 CMS 系统一样,客户基本上可以按照他希望的方式使用后端“编程”网站并将所有内容保存在数据库中......
    猜你喜欢
    • 2012-05-17
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多