Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 这两个表需要什么样的关系?_Mysql_Sql_Foreign Keys_Relational Database - Fatal编程技术网

Mysql 这两个表需要什么样的关系?

Mysql 这两个表需要什么样的关系?,mysql,sql,foreign-keys,relational-database,Mysql,Sql,Foreign Keys,Relational Database,我有两张桌子,想知道他们之间最好的关系是什么。我知道它们之间有关系,但我对一对多、多对一、多对多、单向、双向、多向等感到困惑 这是基本的、显示的结构: 旅行者表: +------------------------------------------+ |姓名|姓|国家身份证号| +------------------------------------------+ |戴安娜|赫伯特| 579643| |弗朗辛|杰克逊| 183432| |奥普拉·丁格尔269537| +-----------

我有两张桌子,想知道他们之间最好的关系是什么。我知道它们之间有关系,但我对一对多、多对一、多对多、单向、双向、多向等感到困惑

这是基本的、显示的结构:

旅行者表:

+------------------------------------------+
|姓名|姓|国家身份证号|
+------------------------------------------+
|戴安娜|赫伯特| 579643|
|弗朗辛|杰克逊| 183432|
|奥普拉·丁格尔269537|
+------------------------------------------+
行程表

+------------------------------------------------------------------------------------------------------+
|起点站|终点站|起点时间|终点时间|旅客|
+------------------------------------------------------------------------------------------------------+
|赫尔|利兹| 13:50 | 14:50 |弗朗辛·杰克逊,奥普拉·丁格尔|
|纽卡斯尔|曼彻斯特| 16:30 | 19:00 |戴安·赫伯特,弗朗辛·杰克逊|
|赫尔|曼彻斯特| 10:00 | 13:00 |戴安·赫伯特、弗朗辛·杰克逊、奥普拉·丁格尔|
+------------------------------------------------------------------------------------------------------+
travelers表还可以,这很有意义:

CREATE TABLE Travelers(
名称VARCHAR(50)不为空,
家族名称VARCHAR(50)不为空,
国家标识号INT(6)非空主键
)
但我不确定如何做行程表。特别是对于旅行者:

创建表行程(
Start_Station VARCHAR(50)不为空,
End_站VARCHAR(50)不为空,
开始时间VARCHAR(50)不为空,
结束时间VARCHAR(50)不为空,
旅行者???????
)

显然,在我的第二张表格中有一列是“旅行者”。因此,这与第一个表有关系。但这是什么呢?我想我需要以某种方式生成一个外键?

您正在寻找一个连接/关联表。这些表应该如下所示:

create table Journeys (
    Journey_Id int auto_increment primary key,
    Start_Station VARCHAR(50) NOT NULL,
    End_Station VARCHAR(50) NOT NULL,
    Start_Time VARCHAR(50) NOT NULL,
    End_Time VARCHAR(50) NOT NULL
)

create table TravelerJourneys (
    traveler_journey_id int auto_increment primary key,
    traveler_id int(6),
    journey_id int,
    foreign key (traveler_id) references travelers(National_ID_Number),
    foreign key (journey_id) references Journeys (journey_id)
);

因为你有n对n的关系。您需要创建一个中间表

在这种情况下,您必须为旅程表创建一个唯一的id,以便轻松标识行

CREATE TABLE TRAVELERS_IN_JOURNEY (
    National_of,
    Journey_id
)
由于列不能包含多个键,您还可以从旅程表中删除Travelers列

CREATE TABLE Journeys (
    Journey_id INT AUTO_INCREMENT PRIMARY KEY,
    Start_Station VARCHAR(50) NOT NULL,
    End_Station VARCHAR(50) NOT NULL,
    Start_Time VARCHAR(50) NOT NULL,
    End_Time VARCHAR(50) NOT NULL
)

首先,我要了解每一种关系是什么,我要解释的是广泛使用的一些基本知识

一对一

一对一关系意味着您有两个具有关系的表,但该关系的存在方式是,表A中的任何给定行在表B中最多只能有一个匹配行

一个学生对唯一的学生有唯一的卷号,这意味着一个学生只能有一个卷号

多对多

一个好的多对多关系设计使用了一种称为联接表的东西。术语联接表只是描述第三个只包含主键的SQL表的一种奇特方式

很多学生可以有很多科目

一对多

一对多关系是一种基数类型,指两个实体a和B之间的关系,其中a的一个元素可以链接到B的多个元素,但B的一个成员只能链接到a的一个元素

例如,将A视为书籍,将B视为页面。一本书可以有很多页,但一页只能在一本书中

而在您的情况下,Travelers列将其设置为外键,即Traveler表的主键

原因:一个旅行者可以进行多次旅行。所以这里的关系是一对多的关系

I关系•先决条件解释 有大量的错误信息;“理论家”和所有跟随他们的作者在“文学”中制造的虚假信息。当然,这是非常混乱的,并导致原始的,前关系的记录归档系统并没有完整性;权力以及关系系统的速度。第二,尽管新手在这里努力回答问题,但由于上述原因,他们也非常困惑

我不能提供一个教程,这不是一个简短的问题,你需要了解,然后再深入到问题的解释

1关系 我对一对多、多对一、多对多、单向、双向、多向等感到困惑

  • 单向、双向、多向
    请从你的脑海中删除这些术语,它们不是关系术语(“理论家”和新手喜欢发明新事物,它们除了增加混乱之外没有其他价值)

    • 关系中没有方向。它始终包括:
    • 主键:被引用的对象、父端和
    • a外键:引用父PK的子端
    • 在SQL代码级别,DML,您可以感知到一个“方向”,即父到子或子到父。这是一个感知(而非存储)的问题,仅与代码的要求有关,即“从该数据到该数据的获取方式”
  • 在物理级别,SQL DDL,只有一种类型的关系Parent::Child,这就是我们所需要的。还没有基数,因为这是由其他方式控制的。与自然界一样,父对象是被引用的对象,子对象是引用父对象的对象

    在基本层面上,也就是说,不是一个关系数据库,而是一个20世纪60年代的记录归档系统 ALTER TABLE child_table ADD CONSTRAINT constraint_name FOREIGN KEY ( foreign_key_column_list ) REFERENCES parent_table ( primary_key_column_list ) ALTER TABLE table ADD CONSTRAINT constraint_name PRIMARY KEY ( column_list ) ALTER TABLE child_table ADD CONSTRAINT constraint_name FOREIGN KEY ( foreign_key_column_list ) -- local child REFERENCES parent_table ( primary_key_column_list ) -- referenced parent ALTER TABLE Customer ADD CONSTRAINT Customer_pk PRIMARY KEY ( CustomerCode ) ALTER TABLE OrderSale ADD CONSTRAINT OrderSale_pk PRIMARY KEY ( CustomerCode, OrderSaleNo ) ALTER TABLE Order ADD CONSTRAINT Customer_Issues_Orders_fk FOREIGN KEY ( CustomerCode ) -- local child REFERENCES Customer ( CustomerCode ) -- referenced parent Each Customer issues 0-to-n OrderSales Each OrderSale is issued by 1 Customer Each User favours 0-to-n ProductPreferences Each Product is favoured in 0-to-n ProductPreferences Each User favours 0-to-n Products (via ProductPreference) Each Product is favoured by 0-to-n Users (via ProductPreference) SELECT * FROM Journey WHERE (condition...) GROUP BY StationStart, DateTimeStart, StationEnd