如何在devise表时实现一对一,一对多和多对多的关系?

任何人都可以解释如何实现一对一,一对多和多对多的关系,同时devise一些例子的表?

一对一:使用引用表的外键:

student: student_id, first_name, last_name, address_id address: address_id, address, city, zipcode, student_id # you can have a # "link back" if you need 

一对多(One-to-many) :在连接到“one”一侧的关系的许多方面使用一个外键:

 teachers: teacher_id, first_name, last_name # the "one" side classes: class_id, class_name, teacher_id # the "many" side 

多对多 :使用联结表( 示例 ):

 student: student_id, first_name, last_name classes: class_id, name, teacher_id student_classes: class_id, student_id # the junction table 

示例查询:

  -- Getting all students for a class: SELECT s.student_id, last_name FROM student_classes sc INNER JOIN students s ON s.student_id = sc.student_id WHERE sc.class_id = X -- Getting all classes for a student: SELECT c.class_id, name FROM student_classes sc INNER JOIN classes c ON c.class_id = sc.class_id WHERE sc.student_id = Y 

这个例子对我来说有点奇怪。 那么,一个学生不能有很多地址? 在现实中它可以。 我认为一个真实的世界的例子,根据我写的文章,这三种关系如下:

1:1

当且仅当表A中的一条logging与表B中最多一条logging相关时,关系是一对一的。

为了build立一对一的关系,表B(无孤立logging)的主键必须是表A(带有孤立logging)的辅助键,

例:

 Create table Gov(GID number(6) primary key, Name varchar2(25), Address VarCHAR2(30), Term_begin date,Term_end Date); Create table State(SID number(3) primary key, State_name varchar2(15), Population number(10), SGID Number(4) references GOV(GID), CONSTRAINT GOV_SDID UNIQUE (SGID)); insert into gov(GID, Name, Address, term_begin) values(110, 'Bob', '123 any st', '1-Jan-2009'); insert into state values(111, 'Virginia', 2000000, 110); 

1:M

当且仅当表A中的一个logging与表B中的一个或多个答复相关时,关系是一对多。但是表B中的一条logging不能与表A中的更多logging相关联。

要build立一对多关系,表A(一个表)的主键必须是表B(多个表)的辅助键。

 create table vendor1 ( vendor_no number(4) primary key, name varchar2(20), address varchar2(20), city varchar2(15), st varchar2(2), zip varchar2(10), contact varchar2(16), phone_no varchar2(12), status varchar2(8), stamp_date date); create table inventory1 ( item varchar2(6) primary key, description varchar2(30), quantity_on_hand number(4) not null, vendor_no number(2) references vendor1(vendor_no), reorder_qty number(3) not null ); 

关系是多对多当且仅当表A的一个logging与表B中的一个或多个logging相关,反之亦然。

要build立一个多对多的关系,创build一个名为“关系”的第三个表,它将具有表A和表B的主键。

 Create table Class (ClsID varchar2(10) primary Key, title Varchar2(30), Instructor Varchar2(30), Day Varchar2(15), time Varchar2(10)); Create table Student (StudID varchar2(15) primary Key, Name Varchar2(35), Major Varchar2(35), Classyr Varchar2(10), Status Varchar2(10)); Create table Stud_class (studid Varchar2 (15) not null, ClsId varchar2 (14) not null, Foreign key (Studid) references Student(Studid), Foreign key (ClsId) references Class(ClsID), UNIQUE (Studid,ClsID)); 

一对一(1-1)关系:这是主键和外键(主键只涉及外键只有一条logging)之间的关系。 这是一对一的关系。

一对多(1-M)关系:这也是主键与外键之间的关系,但是这里与多个logging有关的主键(即表A有书信息,表B有一本书的多个出版者)。

多对多(MM):多对多包括两个维度,下面以样本完整地解释。

 -- This table will hold our phone calls. CREATE TABLE dbo.PhoneCalls ( ID INT IDENTITY(1, 1) NOT NULL, CallTime DATETIME NOT NULL DEFAULT GETDATE(), CallerPhoneNumber CHAR(10) NOT NULL ) -- This table will hold our "tickets" (or cases). CREATE TABLE dbo.Tickets ( ID INT IDENTITY(1, 1) NOT NULL, CreatedTime DATETIME NOT NULL DEFAULT GETDATE(), Subject VARCHAR(250) NOT NULL, Notes VARCHAR(8000) NOT NULL, Completed BIT NOT NULL DEFAULT 0 ) -- This table will link a phone call with a ticket. CREATE TABLE dbo.PhoneCalls_Tickets ( PhoneCallID INT NOT NULL, TicketID INT NOT NULL )