1

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

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

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

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

有没有办法在创建表时制作“可选主键”或使用 if 语句?还是一种可选参考的方法?我已经尝试过 if 语句和一个案例,但它没有用。

4

1 回答 1

1

很大程度上取决于这些实体所代表的确切含义。由于票证可以用于数据包或项目,这意味着有一些更高级别的实体将数据包和项目结合在一起。这可以建模为一个新表,它是两者的父表,PACKET或者PROJECT可以通过组合PACKETandPROJECT表并添加一个TYPE区分数据包和项目的列来建模。然后该TICKET表将引用新的父表或组合表。

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

于 2012-12-17T18:28:04.777 回答