Oracle SQL可选主键

时间:2012-12-17 18:15:15

标签: sql oracle reference primary-key optional

我正在处理的oracle SQL项目中遇到问题:

我有一个(弱)实体'Ticket'作为主键:(Customer_id,packet_id,project_id,ticket_id)。 Customer_id,packet_id和project_id也是外键。

但是,票证只能用于数据包或项目,并且因为它们都在主键中,所以它们不能为空,而其中一个实际上将始终为空。但我需要两者,因为票总是属于其中一张。

我想到了一个可能的解决方案,我想我可以为所有产品制作1个ID,但是还有另一个问题,因为如果我想将这个product_id作为外键实现,我不知道哪个实体我应该让它参考。

在创建表时,有没有办法制作'可选主键'或使用if-statements?或者一种制作可选参考的方法?我尝试了if语句和案例,但它没有用。

1 个答案:

答案 0 :(得分:1)

很多将取决于这些实体究竟代表什么。由于票证可以用于数据包或项目,这意味着存在一些将数据包和项目组合在一起的更高级别的实体。这可以建模为一个新表,它是PACKETPROJECT的父表,也可以通过组合PACKETPROJECT表并添加{来建模{1}}列区分数据包和项目。然后TYPE表将引用新的父表或组合表。

退一步,如果TICKET实体有TICKET,则TICKET_ID单独应该是主键。如果您有TICKET_ID列,那么您将拥有复合主键似乎很不寻常 - 您是否真的希望允许TICKET_ID表中具有相同TICKET的多行相关联对不同的客户,数据包和项目?如果TICKET_ID单独作为主键,那么TICKET_IDPACKET_ID都可以是可以为空的外键,并且您可以创建PROJECT_ID约束,以确保两者中的一个恰好是非NULL。