代码之家  ›  专栏  ›  技术社区  ›  Budda

如何处理数据库和应用程序中的“类型”字段?

  •  2
  • Budda  · 技术社区  · 15 年前

    需要实现日志记录,消息计划存储在数据库的“日志”表中。在其他字段中,每条消息都有一个“状态”字段:0-成功,1-错误数据,2-错误用户,3-无论什么,4-等等。

    简单的想法是将“status”字段作为“int”列存储在同一个表中…要在表中推送数据,将创建特殊枚举,类似于此(例如,让我们使用C.NET,但任何语言都可以工作):

    enum LogStatusEnum
    {
        Successful=0,
        WrongData=1,
        WrongUser=2,
    }
    void main()
    {
        LogStatusEnum status = LogStatusEnum.Successful;
        int statusValue = (int)status;
        string query = "INSERT INTO log (Status, ...) VALUES ("+statusValue+",...)";
    }
    

    还有另一种方法:创建额外的表,例如“Log_status”和字段“statusid”(int,autoincrement)、“statuscode”(varchar)、“statusdescription”(varchar),这些字段将包含每个状态字段的单独记录(两个表都应用了一个外键)。在这种情况下,在将数据添加到“日志”表ID之前,应先通过查询获取所需的“代码”:

    query = "SELECT Id FROM LogStatus WHERE StatusCode='"+GetStatusCode(status)+"'";
    

    这个(收到的)ID将用于填充“日志”表。

    在这两种情况下,您都需要保持数据库端和应用程序端的同步。但在我看来,第二种方法要好一点:

    1. 更安全:你需要确保 你的“地位”真的存在于 在添加数据之前,您将 约束(错误的状态不会是 新增)。
    2. 更多的数据驱动(很难说 对我来说,为什么它更好,但我补充 那)

    为了获得这些好处,您需要支付:向数据库执行一个请求,通过状态代码获取状态ID。

    你认为实施第二种方法是合理的吗?还是第一个也合适?你看到第二种方法的其他优点还是第一种方法的缺点?

    任何想法都是受欢迎的。

    提前谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Jakob Borg    15 年前

    The second approach is usually better. 如果需要新的状态类型,只需要更新数据库,而不需要更新应用程序代码中的数据结构。

    如果要进行大量插入,则不应每次都查询状态ID,而是将其缓存。

        2
  •  0
  •   Hans Olsson    15 年前

    假设数据库中的日志状态是相当静态的,我会设置应用程序在启动时将它们全部加载到本地缓存中,这样就不必一直加载它们。

    如果可能的话,我喜欢第二种方法。除非您在一个很难获得批准的地方工作,手动更改表中的数据以添加更多状态等。

        3
  •  0
  •   Adrian K    15 年前

    我会在数据库中定义状态代码,虽然int字段可以,但是char(4)会更好,因为代码是人类可读的,而-you 应该 同时说明说明;

    • “确定”,“操作按计划进行”
    • “wusr”,“错误用户”
    • “wdat”,“错误数据”

    在数据库中使用数字和没有描述的问题是,如果不确定代码是同步的,或者不知道代码是什么,就不能报告出来。把这些都放在一起,从长远来看,会使生活更容易——保持 Common Reuse Principle 铭记在心。

    使描述尽可能有用。从内存来看,在MS SQL中,char(4)使用的空间量与int相同,因此您不必使用char来使用额外的空间。

    我肯定不会使用foreignkey从外部将代码识别为一个自动递增的数字;如果值不稳定,您将失去代码的完整性。

    如果你要将状态代码硬编码到应用程序中,我建议包括一种让人们不必查看源代码就可以访问代码的方法;文档可能会切断它,但很容易失去同步-你想要的是任何人(如管理员/DBA)都可以轻松调用的某种可调用接口(UI、WebService等)。 Attributes 这是一个很好的方法。

    对于一般参考(或预构建的实现),我强烈建议查看 MS Enterprise Libraries ,这包括一个日志块,还包括一个数据库响应。