在c ++ sqlite3中编码多对多的关系

时间:2014-01-30 16:35:13

标签: c++ sqlite

我试图在c ++ sqlite3中编写多对多的关系。

在下图中,

diagram

  • 经理可以增加许多工作机会。
  • 许多经理正在增加就业机会

    我的创建表语句

     "CREATE TABLE Manager(" \
     "manager_id INTEGER PRIMARY KEY NOT NULL,"\
     "name varchar(45) NOT NULL);"
    
     "CREATE TABLE jobs ("
     "jobId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"\
     "jobTitle varchar(45) NOT NULL);"
    
     "CREATE TABLE Add ("
     "manager_id,jobId INTEGER PRIMARY KEY NOT NULL,"\
     "date varchar(45) NOT NULL,"\
     "FOREIGN KEY(manager_id) REFERENCES Manager(manager_id),"\
     "FOREIGN KEY(job_id) REFERENCES jobs(job_id));";
    

我的经理表填充了以下信息

1|john
2|bob

让我们说经理john已经添加了两个职位,jobTitle jobA和jobB

然后我的插入语句代码将如下所示。http://pastebin.com/0E8CzPgX

然后我的作业表填充了以下信息

1|jobA
2|jobB

最后一步是取john(经理id = 1)和两个jobsId(1,2)的id并将其添加到里面 添加表。我不知道应该如何编码 这样add表就会变成这样。

添加表格

manager_id|job_id|date
    1     |  1   |30-01-2014
    1     |  2   |30-01-2014

请告知。谢谢

1 个答案:

答案 0 :(得分:1)

你的意思是

sql = "INSERT INTO Add(manager_id,jobId,date) VALUES (?,?,?);";

您的问题似乎是您将jobID定义为表Add的主键,这是您不需要的。

jobId INTEGER PRIMARY KEY NOT NUL

数据库中多对多关系的常用方法是包含一个中间表。

这个中间表(我们称之为Manager_jobs)至少有两列,都通过外键引用其他表。第一个属性是Manager的主键,第二个属性是作业的主键。

每次添加作业时,只需分别使用外键向Manager_jobs添加一个条目。

所以,Manager_jobs看起来像这样:

ManagerID | JobID
==========|======
    4     |   2
    3     |   2
    4     |   1

正如您所看到的,Manager_jobs可以编码Manager分配了多个作业,反之亦然。

当然,这种方法要求您为两个数据表都使用某种形式的主键。