【问题标题】:How to deal with foreign keys that are being used in transactions?如何处理交易中使用的外键?
【发布时间】:2013-07-13 03:21:53
【问题描述】:

我想问一下你是如何处理外键的?
你是级联删除,还是只是将其标记为已删除但它在那里?
这是我的示例:

用户(表)1 ------ * 事务(具有用户 ID 的表) 1 | | * Items(table) 1 ------ * TransactionItems(具有ItemId的表)

(此场景适用于销售交易)

如果我删除了正在使用的用户,那么所有具有该用户的交易 用户 id 将被删除,这当然是不行的..

简单的答案可能是不允许应用程序的用户删除被引用的用户记录。所以这意味着你不能允许级联删除对吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    这将为诸如历史报告之类的事情保留 userId(您可以将 Transactions 表连接到 Users 表,并且仍然匹配 Transactions 表中的所有 usersId),但允许从您的角度进行逻辑“删除”应用。

    TransactionItems 表中的 itemId 也是如此;您对 Items 表的加入仍将匹配所有 itemId。

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

    【讨论】:

    • 您好,感谢您的回答。我之前就想到了这一点..所以应用程序用户将按下删除按钮,但它只是在数据库中被标记为已删除并且不会出现在查询中..谢谢..但是我必须把交易和交易项目之间的关系怎么样级联删除他们的关系?
    • 我不明白 Transactions 和 TransactionItems 是其他表......所以在这种情况下,您可以在这些表之间的关系上设置 Cascade Delete。我添加到我原来的答案。
    • 您如何处理日志记录或审计跟踪表?参考?还是实际数据?或操作的任何指标列?
    • 这里有一些很好的讨论可能会回答你的问题:stackoverflow.com/questions/1071513/…
    • 感谢您的链接 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多