如何处理交易中使用的外键?

时间:2013-07-12 17:59:28

标签: database database-design foreign-keys relational-database database-schema

我想问一下你是如何处理外键的? 您是否级联删除,或者只是将其标记为已删除但是在那里? 这是我的样本:

Users(table) 1 ------ * Transactions(Table that has userId)
                             1
                             |
                             |
                             *
Items(table) 1 ------ * TransactionItems(Table That has ItemId)

(此方案适用于销售交易)

如果我删除了在事务中使用的所有事务的用户 用户ID将被删除,当然不是正确的..

简单的答案可能是不允许应用程序的用户删除正在引用的用户记录。那么这意味着你不能允许级联删除吗?

所以,如果我对Transactions和TransactionItems之间的关系使用级联删除 那可以吗?由于没有被引用。

1 个答案:

答案 0 :(得分:0)

我会在名为“Active”的Users和Items表中添加一个位或bool字段。将所有记录设置为TRUE。当需要“删除”用户或项目时,将该位设置为FALSE。更改应用程序中的所有查询以过滤用户和项目表WHERE Active ='TRUE',以便应用程序仅看到“未删除的”用户或项目。

这将保留userId以用于诸如历史报告之类的东西(您可以将Transactions表加入Users表并仍然匹配Transactions表中的所有usersId),但允许从您的角度进行逻辑“删除”应用

同样适用于TransactionItems表中的itemId;您对Items表的加入仍将匹配所有itemId。

对于Transactions与TransactionItems的关系,由于没有两个事务记录可以与同一TransactionItems记录相关,因此可以将关系设置为Cascade Delete,这样当删除Transacations表中的记录时,所有相关的TransactionsItems记录都是也被删除了。 (与那些已删除的TransactionItem相关的任何项目仍将保留。)