Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在RDBMS中存储稍微不同类型的记录_Sql_Database Design_Relational Database_Data Modeling - Fatal编程技术网

Sql 在RDBMS中存储稍微不同类型的记录

Sql 在RDBMS中存储稍微不同类型的记录,sql,database-design,relational-database,data-modeling,Sql,Database Design,Relational Database,Data Modeling,我知道SQL,但我对它没有太多的经验。我有一个系统,我想在一个索引数据库中记录用户登录、注销和其他与安全相关的事件,以便能够对其进行手动查询,我认为一些基于SQL的RDBMS应该最适合这项工作 但是,我想存储的记录具有相似但不完全相同的数据。所有记录都将存储时间戳和用户名,但其他数据项将有所不同。例如: 登录事件将存储用户登录时使用的IP地址以及所创建会话的ID 注销事件将存储会话ID而不是IP地址(因为我在注销时没有访问IP地址的权限) 电子邮件更改事件将存储用户以前的和新的电子邮件地址

我知道SQL,但我对它没有太多的经验。我有一个系统,我想在一个索引数据库中记录用户登录、注销和其他与安全相关的事件,以便能够对其进行手动查询,我认为一些基于SQL的RDBMS应该最适合这项工作

但是,我想存储的记录具有相似但不完全相同的数据。所有记录都将存储时间戳和用户名,但其他数据项将有所不同。例如:

  • 登录事件将存储用户登录时使用的IP地址以及所创建会话的ID
  • 注销事件将存储会话ID而不是IP地址(因为我在注销时没有访问IP地址的权限)
  • 电子邮件更改事件将存储用户以前的和新的电子邮件地址
在关系数据库中,应该如何建立这样的模型?我可以想象至少三种可能性:

  • 对每种数据项使用不同的表
  • 为所有不同的数据项添加列,并将不使用它们的记录保留为
    NULL
  • 使用一个包含公共数据项的中心表,以及存储其余数据的辅助表,链接到中心表中的事件ID

显然,每一种都有自己的优点和缺点。我确实意识到这是一个有点主观的问题,也可能取决于实际的用例,但我认为应该有标准/最佳实践来解决我没有见过的这类问题。我的建议是否合理或标准?还有其他更好的选择吗?

您提到的解决方案出现在Martin Fowler的书中。你可能想读那本书,看看他对使用这些模式的看法

对每种数据项使用不同的表

为所有不同的数据项添加列,并将不使用这些列的记录保留为NULL

使用一个包含公共数据项的中心表,以及存储其余数据的辅助表,链接到中心表中的事件ID

Fowler还介绍了该问题的第四种解决方案:


数据库的设计应基于数据的使用方式,而不是数据的生成方式(尽管这可以告知各种选项)。你的问题没有说明数据是如何使用的,所以智能设计决策实际上没有依据。@GordonLinoff:我确实写过,我只打算将其用于手动查询。我知道这是一个模糊的描述,那是因为我不知道我要问的是什么样的问题我的基本意图是在安全事件中使用它进行取证。哈哈,我很高兴我设法想出了这个问题的三种常见解决方案虽然我不打算仅仅为此买一本书,但这些模式的名称本身就为我提供了很多谷歌搜索的词汇,导致了描述它们的各个方面和含义的页面。谢谢你!