Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 server 2005 在数据库设计中,有一个不引用任何其他表的表明智吗?_Sql Server 2005_Database Design - Fatal编程技术网

Sql server 2005 在数据库设计中,有一个不引用任何其他表的表明智吗?

Sql server 2005 在数据库设计中,有一个不引用任何其他表的表明智吗?,sql-server-2005,database-design,Sql Server 2005,Database Design,我想得到一些关于数据库设计的建议。具体来说,考虑下面的(假设的)场景: 员工-包含所有员工详细信息的表格 用户-包含具有访问软件的用户名和密码的员工的表格 UserLog-跟踪用户登录和注销时间并计算 软件时间 在这种情况下,如果员工离开公司,我还希望确保将他们从用户表中删除,这样他们就不能再访问软件了。我可以使用删除级联中的实现这一点,作为员工中的员工ID和用户之间的FK关系的一部分 然而,我不想从UserLog中删除他们的详细信息,因为我感兴趣的是整理人们在软件上花费了多长时间的数据,

我想得到一些关于数据库设计的建议。具体来说,考虑下面的(假设的)场景:

  • 员工-包含所有员工详细信息的表格
  • 用户-包含具有访问软件的用户名和密码的员工的表格
  • UserLog-跟踪用户登录和注销时间并计算 软件时间

在这种情况下,如果员工离开公司,我还希望确保将他们从
用户
表中删除,这样他们就不能再访问软件了。我可以使用删除级联中的
实现这一点,作为
员工中的
员工ID
用户之间的FK关系的一部分

然而,我不想从
UserLog
中删除他们的详细信息,因为我感兴趣的是整理人们在软件上花费了多长时间的数据,而且他们不再在公司工作并不意味着他们的用户行为不再相关

剩下的是一个与数据库中任何其他表都没有关系的表
UserLog
这是一个明智的想法吗?

通过阅读书籍等/谷歌在线搜索,我没有发现任何数据库模式与其他表没有关系,因此我的直觉是,我的方法不可靠


请给我一些指导。

明智吗?当然,正如您所描述的,您需要无限期地保留这些用户,这是有道理的。您将遇到的问题是维护表。为了插入新用户,您必须至少使用两次更新,而不是一次级联更新。

您可以使用逻辑删除或通过向用户表添加已删除或禁用的布尔值来禁用用户


或者将EmployeeId替换为用户日志中的员工名称。

这里的问题是,完全可以为从未存在过的用户插入用户日志数据,因为没有指向定义有效用户的表的链接

我想说,也许更好的做法是将用户标记为无效,并在他们离开时删除所有个人信息,而不是完全删除记录


这并不是说,在数据库中没有一个表(或多个表)不引用其他表的情况下是有效的。

我认为您所建议的表是完美的。我经常遇到与其他表没有显式关系的日志表。仅仅因为数据库是“关系型”的,并不意味着所有的东西都必须关联起来

但我注意到的一点是,您在日志中使用了
EmployeeID
,但没有将其用作
Employee
表的外键。我理解你为什么不想这样,因为你会解雇员工。但是,如果完全删除它们,那么
EmployeeID
列就没有意义了


解决方法是为员工保留一个标记,例如
活动
,用于跟踪他们是否处于活动状态。这样,日志数据就有意义了。

在这种情况下,我个人的偏好是通过在Employees表中添加“DeletedDate”列来“软删除”员工。这将允许您维护UserLog表的引用完整性,并且所有员工(过去和现在)的所有详细信息在数据库中保持可用


这种方法的缺点是,您需要添加应用程序逻辑来检查是否有活跃的员工。

IANADBA但通常认为从数据库中删除几乎任何内容都是非常糟糕的做法。在这里,最好使用某种锁定标志/“删除”在用户表上加盖日期戳并保留您的FK。

是的,这非常明智。日志只是对数据的原始审核,永远不会更改。它不需要规范化(也不应该规范化)和/或链接到其他表

理想情况下,我会将写大量的审计日志记录放在一个完全不同的数据库中,而不是将读大量的事务性日常工作放在另一个数据库中。随着时间的推移,它们的生长可能会有所不同。但从小事做起,只要您了解它们之间的根本区别,就可以将它们保存在同一个数据库中

另外,我建议不要从表中删除用户。它们可能有某种IsActive或IsDeleted位,这会有效地将它们从应用程序中屏蔽,但如果可能,应避免删除

这是一个明智的想法吗

问题是这个。由于数据没有链接,您可以从employee表中删除一些内容,并且在UserLog中仍然有引用。删除员工信息后,您无法知道日志数据与什么相关。这样行吗?技术上是的。没有什么可以阻止你这么做,但是你为什么要把数据放在第一位呢?您也不能保证表中的数据实际上是关于员工的。有人可能会在不属于任何人的表中意外输入错误的EmployeeID。密钥有助于防止数据损坏。拥有额外的数据总比拥有糟糕的数据好

我发现,在可能的情况下,您永远不想删除数据。空间很便宜,您可以添加标志等来显示记录未处于活动状态。是的,这确实会导致更多的工作(这可以通过创建一个只显示活动员工的视图来快速解决),并且说您永远不应该删除数据是牵强的,但是您开始将数据链接在一起。删除变得非常困难。如果您添加FK不是为了删除记录,那么这是一个需要重新考虑策略的信号

依赖级联删除也可能非常危险。你是谁的模特