0

好吧,我有一个有 4 列(、、、、id)的表event_id,其中 id 是 PK,是FK,我的问题是:group_idisbnevent_idgroup_id

我需要 isbn 编号对于每个 都是唯一的event_id,让我给你一些应该可能的行和不应该行的示例:

 id | event_id | group_id | isbn
 (1,1,1,123) ok 
 (2,1,2,123) ok
 (3,1,4,123) ok
 (4,1,7,1234) ok
 (5,2,8,123) NOT OK, the 'isbn' must be unique for event_id('123' was already used in the first row with event_id = 1)

每个group_id只出现一次event_id,但如果我用 3 列创建一个独特的约束,我将能够重复 isbn 只是改变event_id,而且我不希望这样,一旦isbn在 an 中使用event_id它就不能出现在另一个event_id中,一个event_id(比如说'1')可以重复相同ibsn的时间,只要它需要每个group_id

我知道我多次重复这个问题,但这是一个棘手的问题,我想降低得到错误答案的机会

EDIT1:关于@Andomar 的答案,isbn 必须通过基数 (1,n) 1-isbn -> n-group_id 与 group_id 相关,并且答案中的结构不这样做

4

2 回答 2

2

What you describe is that event_id is dependant on the isbn . You need to normalize the table by splitting it into two:

(Corrected):

Remove Keep isbn in this - and add a FOREIGN KEY (event_id, isbn) constraint to the second table, below:

id | event_id | group_id | isbn
 1      1          1        123 
 2      1          2        123
 3      1          4        123 
 4      1          7        1234
 5      2          8        123     --- not allowed by the FK constraint

And create a new table with isbn as the primary key and a UNIQUE (event_id, isbn) key (and two foreign keys: event_id to Event table and isbn to (Book?), if you have a table where isbn is the primary or unique key):

event_id | isbn
   1        123 
   1       1234 
于 2012-10-25T18:50:24.817 回答
2

为了保持(event_id, isbn)组合的唯一性:

create unique index UX_YourTable_EventIsbn on YourTable(event_id, isbn)

根据评论,如果您希望每个 isbn 只有一个事件,您可以重新设计表关系。创建一个名为的表,该表isbn具有一个主键isbn和一个名为 的字段event_id。这样,一个 ISBN 可以有零个或一个与之关联的事件。

isbn          isbn primary key, event_id
other_table   id, event_id, group_id

查询将在 isbns 中查找isbn表中的事件。

于 2012-10-25T17:57:55.200 回答