Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Database_Database Design_Normalization_Join - Fatal编程技术网

Mysql 数据库多对多中间表:额外字段

Mysql 数据库多对多中间表:额外字段,mysql,database,database-design,normalization,join,Mysql,Database,Database Design,Normalization,Join,我创建了一个“shops”和一个“customers”表,以及一个customers\u shops中间表。每个商店都有一个site\u urlweb地址,除了一些客户使用另一个url访问商店的站点(该url对于特定客户是唯一的) 在下面的中间表中,我添加了一个附加字段,shop\u site\u url。我的理解是,这是第二种标准化形式,因为商店站点url字段对于特定的客户和商店是唯一的(因此不会针对不同的客户/商店重复)。另外,由于这取决于顾客和商店,我认为这是第三种标准化形式。我只是不习惯

我创建了一个“shops”和一个“customers”表,以及一个customers\u shops中间表。每个商店都有一个
site\u url
web地址,除了一些客户使用另一个url访问商店的站点(该url对于特定客户是唯一的)

在下面的中间表中,我添加了一个附加字段,
shop\u site\u url
。我的理解是,这是第二种标准化形式,因为
商店站点url
字段对于特定的客户和商店是唯一的(因此不会针对不同的客户/商店重复)。另外,由于这取决于顾客和商店,我认为这是第三种标准化形式。我只是不习惯使用“映射”表(
customers\u shops
)来包含其他字段-下面的设计有意义吗,还是我应该保留中间表纯粹作为将多对多关系转换为一对一关系的工具?

######
customers
######

id INT(11) NOT NULL PRIMARY KEY
name VARCHAR(80) NOT NULL

######
shops
######

id INT(11) NOT NULL PRIMARY KEY
site_url TEXT

######
customers_shops
######

id INT(11) NOT NULL PRIMARY KEY
customer_id INT(11) NOT NULL
shop_id INT(11) NOT NULL
shop_site_url TEXT //added for a specific url for customer

谢谢

您的模式确实有意义,因为
商店\站点\ url
是关系本身的一个属性。您可能希望给它一个更有意义的名称,以便将其与
商店区分开来。site\u url

您的模式确实有意义,因为
商店\u site\u url
是关系本身的一个属性。您可能想给它一个更有意义的名称,以便将其与
商店区分开来。站点\u url

您还想把这些信息放在哪里?这不是商店的属性,也不是顾客的属性。如果希望避免出现可为空的列,您可以将其放在一个单独的表中,但最终必须从这个新表中引用您的中间表,这可能会让您觉得更奇怪。

您还会将此信息放在哪里?这不是商店的属性,也不是顾客的属性。如果希望避免出现可为空的列,可以将其放在一个单独的表中,但最终必须从这个新表中引用中间表,这可能会让您觉得更奇怪。

关系可以有属性,就像实体可以有属性一样

实体属性进入实体表的列中。关系属性(至少对于多对多关系而言)位于关系表中


听起来好像,一般来说,URL是由商店和客户的组合决定的。所以我会把它放在商店的顾客桌上。事实上,许多商店只有一个URL,这表明有第五种标准形式比这更微妙。但是我太懒了,无法计算出来。

关系可以有属性,就像实体可以有属性一样

实体属性进入实体表的列中。关系属性(至少对于多对多关系而言)位于关系表中


听起来好像,一般来说,URL是由商店和客户的组合决定的。所以我会把它放在商店的顾客桌上。事实上,许多商店只有一个URL,这表明有第五种标准形式比这更微妙。但是我太懒了,无法计算出来。

好吧,让我们创建表,插入一些示例数据,然后查看结果

id cust_id  shop_id  shop_site_url
--
1  1000     2000     NULL
2  1000     2000     http://here-an-url.com
3  1000     2000     http://there-an-url.com
4  1000     2000     http://everywhere-an-url-url.com
5  1001     2000     NULL
6  1001     2000     http://here-an-url.com
7  1001     2000     http://there-an-url.com
8  1001     2000     http://everywhere-an-url-url.com
嗯。那看起来不太好。让我们暂时忽略另一个URL。要创建解析m:n关系的表,需要对构成m:n关系的列进行约束

create table customers_shops (
    customer_id integer not null references customers (customer_id),
    shop_id integer not null references shops (shop_id),
    primary key (customer_id, shop_id)
);
(我删除了“id”列,因为它往往会掩盖正在发生的事情。如果您愿意,可以稍后添加。)

插入一些示例数据。然后

select customer_id as cust_id, shop_id
from customers_shops;

cust_id  shop_id
--
1000     2000
1001     2000
1000     2001
1001     2001
更接近了。在这种表中,客户和店铺的每一个组合只有一行。(即使没有url,这也是有用的数据。)现在我们如何处理替代url?这取决于几件事

  • 客户是否通过网络访问网站 只有一个URL,或者他们可能会使用更多URL 不止一个
如果答案是“仅一个”,则可以为此URL表添加一列,并使该列唯一。它是此表的候选键

如果答案是“不止一个——至少是站点url和备选url”,那么您需要对约束做出更多的决定,因为更改此表以允许客户和商店的每个组合使用多个url,这就跨越了此要求的范围:

shop\u site\u url字段对于一个 特定客户和商店 (因此,不会复制到 不同的顾客/商店)

本质上,我要求您决定这个表的含义——定义这个表的谓词。例如,这两个不同的谓词导致不同的表结构

  • 客户“n”已访问该网站 对于商店'm'使用url's'
  • 允许客户“n”访问 使用替换项的商店“m”的网站 url's'

好吧,让我们创建表格,插入一些示例数据,然后查看结果

id cust_id  shop_id  shop_site_url
--
1  1000     2000     NULL
2  1000     2000     http://here-an-url.com
3  1000     2000     http://there-an-url.com
4  1000     2000     http://everywhere-an-url-url.com
5  1001     2000     NULL
6  1001     2000     http://here-an-url.com
7  1001     2000     http://there-an-url.com
8  1001     2000     http://everywhere-an-url-url.com
嗯。那看起来不太好。让我们暂时忽略另一个URL。要创建解析m:n关系的表,需要对构成m:n关系的列进行约束

create table customers_shops (
    customer_id integer not null references customers (customer_id),
    shop_id integer not null references shops (shop_id),
    primary key (customer_id, shop_id)
);
(我删除了“id”列,因为它往往会掩盖正在发生的事情。如果您愿意,可以稍后添加。)

插入一些示例数据。然后

select customer_id as cust_id, shop_id
from customers_shops;

cust_id  shop_id
--
1000     2000
1001     2000
1000     2001
1001     2001
更接近了。在这种表中,客户和店铺的每一个组合只有一行。(即使没有url,这也是有用的数据。)现在我们如何处理替代url?这取决于几件事

  • 客户是否通过网络访问网站 只有一个URL,或者他们可能会使用更多URL 不止一个
如果答案是“仅一个”,则可以为此URL表添加一列,并使该列唯一。这是这个t的候选键