2010-03-12 71 views
1

我有一个有两个子表的表。对于父表中的每条记录,我希望在其中一个子表中有一个且只有一个记录 - 每个记录中都不是一个,也不是一个。我如何定义?保证孩子记录在一张桌子或另一张桌子上,但不是两个?

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

我有一个数据库,其中包含有关用户调查的数据。它最初设计有一种用于开始调查的认证方法。从那时起,需求已经发生了变化,现在有两种不同的方式可以签署开始调查。

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

我正在使用MySQL,所以也许有一个功能,MySQL并没有实现,让我这样做。

回答

1

有多种方法可以实现这个

布尔标志逻辑

你可以有一个布尔标志ParentTable称为ChildTableDataInserted如果行插入任何一个表,你可以更新为TRUE 。如果ChildTableDataInserted为False,则只插入到子行中。这当然取决于所有使用您创建的存储过程的插入,并且很容易被违反,但数据库的开销很小。

触发器

将一个BEFORE INSERT上的数据插入到两个子表的,如果你的故障条件满足,就可以提高用于插入一个错误。

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

了解更多关于触发这里

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

+0

啊!触发器是我从未使用过的东西。这是一种没有其他选择,只有触发器的情况吗?你会怎么做我想做的事? – user151841 2010-03-12 15:23:36

+2

我会考虑违反第三范式并将4列放在一张表中。 – 2010-03-12 16:35:19

+0

实用性胜出,Raj :) – user151841 2010-03-15 18:09:17

相关问题