AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 146262
Accepted
krystah
krystah
Asked: 2016-08-10 01:52:42 +0800 CST2016-08-10 01:52:42 +0800 CST 2016-08-10 01:52:42 +0800 CST

当更改的属性的数据类型可能不同时,我应该如何记录对对象的更改?

  • 772

我正在尝试创建一个用于将事件存储到company-object 的日志表,恐怕我可能走错了路。我得出的结论是我应该在同一列中记录不同的数据类型,但感觉不对。我将用 2 个表解释基本用例;company和user。

company
- id int
- name nvarchar
- description

user
- id int
- name nvarchar
- company int (references company.id)

现在,假设我想在company-object 上记录不同类型的事件。我会创建一个名为的日志表company_log并将company_log_type事件存储在那里。这些表看起来像这样:

company_log
- id int
- old_value nvarchar
- new_value nvarchar
- log_type int (references company_log_type.id)

company_log_type
- id int
- name

有趣事件的例子是

  • 公司名称已更改
  • 公司描述已更改
  • 一个用户被添加到公司
  • 用户已从公司中删除

对于前两个事件,我将存储事件类型、旧值和新值。只要我停在这里,它就可以正常工作。但是,如果我想记录 2 个以前的事件,我需要能够在同一列中存储不同的数据类型。更改看起来像这样:

old_value     new_value     log_type
----------------------------------------------
Acme          PiedPiper     CompanyNameChanged
NULL          132           UserAdded
97            NULL          UserRemoved

在这一点上,我需要存储公司名称的文本旧/新值,以及最近添加的用户的 ID。你可能会看到我已经走错了方向,这就是我寻求帮助。我有两个问题:

我应该只使用sql_variant-datatype,还是如果这被认为是糟糕的设计,那么存储这些日志事件的明智方法是什么?

提前致谢。

sql-server-2012
  • 1 1 个回答
  • 63 Views

1 个回答

  • Voted
  1. Best Answer
    Magier
    2016-08-10T04:46:00+08:002016-08-10T04:46:00+08:00

    sql_variant 类型存在限制和困难。有关详细信息,请参阅 MSDN:SQL 变体

    正如您已经“感觉”到的那样,您可能还会陷入稍后转换和转换的问题。有关示例,请参阅显式转换 SQL Server 数据类型的 10 个理由。

    如果可能的话,我会尽量避免这种情况和任何其他情况的变体。

    但是您的基本问题不是变体类型,而是您的表格设计。即使您的日志表中只有整数值,我仍然会考虑将其更改为更规范化的值。

    但是,在考虑了您的问题之后,我想到了另一种可能值得一试的方法:为什么不将日志表设计为与原始表相同。

    例如:

    company_log
    - id int
    - name nvarchar
    - description
    - log_stamp datetime
    - Log_type
    

    这样,您可以在每次更改原始行时添加一个新行,并将前一行添加到日志表中。这将为您提供行的完整历史记录,而不会出现任何数据类型问题。

    您还可以将日志记录限制为特定列的更改。我想你需要触发器来实现它。

    它会给你多个日志表,但如果你保持它们相似log_type,log_stamp你仍然可以查询它们的任何更改(跟踪表)的整个历史UNION。

    我发现了另一个问题,其中非常详细地解释了这个问题和其他可能的解决方法:How to store historical records in a history table in SQL Server

    • 1

相关问题

  • SQL Server 2012 在 TempDb 中使用排序创建索引 - 获得 False?

  • SQL Server AlwaysOn 故障转移透明度

  • 为什么 Denali 序列应该比标识列表现更好?

  • SQL Server 不应该支持范围吗?

  • 什么是 SQL Server“德纳利”?什么是新的?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve