一对多关系的复合键?

时间:2016-03-22 16:37:45

标签: sql postgresql

对于store我有很多store_offers这是一对多的关系。

然而,对于表

create table store (    
  id bigserial primary key
);

我可以使用一个主键idSQLfiddle):

create table store_offer (

  id bigserial primary key,

  store_id bigint not null,

  constraint fk__store_offer__store
    foreign key (store_id)
    references store(id)    
);

或复合主键(id, store_id)SQLFiddle):

create table store_offer (

  id bigserial not null,

  store_id bigint not null,

  constraint fk__store_offer__store
    foreign key (store_id)
    references store(id),

  primary key(id, store_id)    
);

我的问题是" 这里更有意义的是什么?"。 Imho复合键应该是正确的方法,因为store_offer实际上是" 绑定"为store。但有人可以说,由于第一个版本有一个外键,情况就已如此。另一方面,store_offer主键实际上不能在创建后更改。你必须创建一个新的store_offer并删除旧的store_id如果要丢弃旧的Sub Process_Globals Dim Timer1 As Timer .... End Sub Sub Activity_Create(FirstTime As Boolean) Timer1.Initialize("Timer1", 1000) ' 1000 = 1 second Timer1.Enabled = True ... End Sub Sub b_reponse1_Click p= p + 1 If b_reponse1.Text = r5 Then score = score + 1 b_reponse1.Color=Colors.Green CallSub("",timer1_tick) ' Here i call sub timer1_tick b_reponse1.Color=Colors.Gray Else b_reponse1.Color=Colors.Red b_reponse1.Color=Colors.Gray End If If nbqpassee = 10 Then Activity.RemoveAllViews Activity.LoadLayout("lay_main") Else CallSub("",loadq) End If End Sub 。但是你不能简单地在第二种方法中改变Sub timer1_tick t = t + 1 Log(t) End Sub

那么这里的答案是什么?

1 个答案:

答案 0 :(得分:0)

使用主键(id,store_id)是个坏主意。这将使许多查询更复杂,更容易出错。听起来你真正想要做的是商店和优惠之间的多对多关系。如果是这种情况,您应该有一个存储表,其中唯一的store_id作为主键,商品表具有唯一的offer_id作为主键,store_offer表具有store_id和offer_id的主键。