c# - 需要 SQL Server 数据库和应用程序设计级别建议。数据库或应用程序中的约束?

标签 c# sql-server database

我需要一些建议来实现业务规则 - 是将其保存在数据库中(使用触发器)还是应用程序代码中。

--- Table structure:---

# ORG - Master table for Organizations 
# USER - Master table for Users (each user belongs to an Org so there's a field OrgId which is FK ro ORG) 
# SITE - Master table for Sites

# ORGSITE - {OrgId, SiteId} links Site(s) with Org(s) 
# USERSITE - {UserId, SiteId} links Site(s) with User(s)

约束是:“用户只有在他的组织可以访问网站时才能访问该网站。”


现在,在第 1 天我们将 Site1 与 Org1 相关联,然后我们能够将 Site1 与 User1 相关联(User1 属于 Org1)。在第 2 天,我从 ORGSITE 中删除了 Site1 和 Org1 之间的关系(这需要我也从 USERSITE 表中删除相应的 User1 和 Site1 关系)。

这是从应用程序代码中处理的。所以,现在我的问题是我应该在哪里保留上述约束处理 -

方法#1:

在将处理事件的 ORGSITE 表和 USER 表上部署 TRIGGER:

  1. ORGSITE 删除后开启(删除 相应的 USERSITE 记录)

  2. USER 的更新后(如果用户的 更改组织然后删除他的所有 来自 USERSITE 的记录)

方法#2:

在代码中处理一切 - 点击触发这些数据库操作的事件并从 USERSITE 中删除记录(必要时)。需要通过事务管理。

方法#3:

简单地说,在 USERSITE 表中添加一个新字段 OrgSiteId,这是对 ORGSITE 的“自动增量 PK:Id”的 FK 引用。接下来,我将为 USERSITE.OrgSiteId FK 部署级联删除。这将处理大部分事情并使其隐式化!

希望我解释得很好。方法#3 真的有用吗?如果不是,您的偏好是什么?为什么?

感谢您的宝贵时间。

最佳答案

如果您认为有人会直接从数据库运行查询(比如 DBA),那么您应该在触发器中处理它。如果您通过该应用程序进行操作,则必须始终通过该应用程序进行操作。

关于c# - 需要 SQL Server 数据库和应用程序设计级别建议。数据库或应用程序中的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139648/

相关文章:

c# - 是否有理由在括号内返回 null

c# - 是否可以将数据绑定(bind)到内存中的对象并允许数据绑定(bind)到 XML

c# - TransactionScope 错误保存大量信息

sql - Windows SQL 数据库行顺序?

c# - 使用现有范围名称从电子表格中读取或检索值

C# - 流问题

sql - 在 SQL Server 中将日期列更改为日期时间

sql-server - 子查询返回超过 1 个值。当子查询后面有 =、!=、<、<=、>、>= 或子查询用作表达式时,不允许这样做

.net - Sql 连接类 类与模块 - .NET

database - 实体类型和实体集的区别?