Mysql 数据库多对多中间表:额外字段
我创建了一个“shops”和一个“customers”表,以及一个customers\u shops中间表。每个商店都有一个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字段对于特定的客户和商店是唯一的(因此不会针对不同的客户/商店重复)。另外,由于这取决于顾客和商店,我认为这是第三种标准化形式。我只是不习惯
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 不止一个
- 客户“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 不止一个