【问题标题】:guarantee child records either in one table or another, but not both?保证子记录要么在一个表中,要么在另一个表中,但不能同时在两者中?
【发布时间】:2010-03-12 15:14:53
【问题描述】:

我有一个有两个子表的表。对于父表中的每条记录,我想要一个子表中的一个且只有一个记录——不是每个都有一个,也不是没有。如何定义?

这是背景故事。随意批评这个实现,但请回答上面的问题,因为这不是我唯一一次遇到它:

我有一个数据库,其中包含与用户调查有关的数据。它最初设计为使用一种身份验证方法来启动调查。从那时起,要求发生了变化,现在人们可以通过两种不同的方式登录以开始调查。

最初我在调查表的列中捕获了身份验证令牌。由于要求发生了变化,我想在身份验证中捕获其他三个数据位。因此,对于调查表中的每条记录,我要么拥有一个令牌,要么拥有一组三个。所有这四个都是不同的类型,所以我的想法是,而不是有四个列,其中一个将是空的,或者三个将是空的(或者更糟糕的是,这些场景中的任何一个都是糟糕的混搭),我将有两个子表,一个用于保存单个身份验证令牌,另一个用于保存三个。问题是,我不知道如何在 DDL 中定义它。

我正在使用 MySQL,所以也许有一个 MySQL 没有实现的功能让我可以做到这一点。

【问题讨论】:

    标签: database-design rdbms ddl database-agnostic


    【解决方案1】:

    有多种方法可以实现这一点

    布尔标志逻辑

    您可以在 ParentTable 中有一个名为 ChildTableDataInserted 的布尔标志,如果在任何一个表中插入行,您可以将其更新为 TRUE。仅当 ChildTableDataInserted 为 False 时才插入子行。这当然依赖于使用您创建的存储过程的所有插入,并且很容易被违反,但是数据库的开销很小。

    触发器

    在两个子表的数据插入上放置一个BEFORE INSERT,如果满足您的错误条件,您可以为插入引发错误。

    我个人避免使用触发器,除非我绝对没有其他选择,这似乎是实现触发器的好地方。

    在此处阅读有关触发器的更多信息

    http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

    【讨论】:

    • 啊!触发器是我从未使用过的东西。这是一种除了触发器别无选择的情况吗?你会怎么做我想做的事?
    • 我会考虑违反第三范式并将 4 列放在一个表中。
    • 实用性胜出,Raj :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2016-06-21
    • 2010-09-26
    相关资源
    最近更新 更多