【发布时间】:2011-03-07 09:53:15
【问题描述】:
有必要实现日志记录,消息计划存储在数据库中的“日志”表中。在其他字段中,每条消息都会有一个“状态”字段:0 - 成功,1 - 错误数据,2 - 错误用户,3 - 随便,4 - 等等...
简单的想法是将“状态”字段作为“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 将用于填充“日志”表。
在这两种情况下,您都需要在数据库端和应用程序端保持同步。但从我的角度来看,第二种方法要好一些:
- 更安全:您需要确保 您的“状态”确实存在于 数据库在添加数据之前,您将拥有 一个约束(错误的状态不会是 添加)。
- 更多数据驱动(很难说 对我来说为什么它更好,但我填写 那个)。
为了获得这些好处,您需要支付:向 DB 执行请求以通过状态代码获取状态 ID。
您认为实施第二种方法是否合理?还是第一个也适合?您是否看到第二种方法的其他优点或第一种方法的缺点?
欢迎提出任何想法。
提前谢谢你。
【问题讨论】:
标签: c# .net database-design architecture