复杂的逻辑约束

时间:2011-10-19 08:38:52

标签: sql constraints

我正在尝试在具有以下特征的模式上强制执行数据正确性:

表:

|SAVE_TYPE|PROFILE|USERNAME|DATA|

根据保存类型,将使用配置文件列或用户名列。想象一下,如果想要在配置文件范围内保存数据,那么我将插入以下行:

|SAVE_TYPE|PROFILE|USERNAME|DATA|
|PROFILE  |PROF. 1|Mr. X   |123 |

此行表示数据将可用于配置文件PROF。 1,用户X先生插入。另一方面,在这种情况下:

|SAVE_TYPE|PROFILE|USERNAME|DATA|
|USER     |NULL   |Mr. X   |456 |

此行表示数据仅适用于X先生。

我不知道实现此行为约束的最佳方法是什么,可能是我应该使用另一个表结构(我打开以更改架构)。 现在我所拥有的是SAVE_TYPE,PROFILE和USERNAME列的唯一约束,但这现在完全正确。我的模型接受错误的数据:

SAVE_TYPE上的多个实例 - >同一用户的USER。

|SAVE_TYPE|PROFILE|USERNAME|DATA|
|USER     |PROF. 1|Mr. X   |456 |
|USER     |PROF. 2|Mr. X   |456 |
|USER     |PROF. 3|Mr. X   |456 |

SAVE_TYPE上的多个实例 - >相同配置文件的配置文件。

|SAVE_TYPE|PROFILE|USERNAME|DATA|
|PROFILE  |PROF. 1|Mr. X   |123 |
|PROFILE  |PROF. 1|Mr. Y   |123 |
|PROFILE  |PROF. 1|Mr. Z   |123 |

先谢谢,希望我已经说清楚了:)

1 个答案:

答案 0 :(得分:2)

“此行表示数据将可用于配置文件PROF.1,并由用户X先生插入。”

“此行表示数据仅适用于X先生。”

如果你的“行的意义”是如此不同,那么这表明你手边的东西应该是两个不同的表格。

就关系理论而言:每个relvar(“table”)都有一个相关的外部谓词(“表中的行实际意味着什么”)。因此,如果您有两个不同的谓词,那么您还应该有两个不同的relvars。