[MySQL]注意:关系:1–1,1-n,n-n,nest

[MySQL]注意:关系:1–1,1-n,n-n,nest

原文:https://medium.com/hackernoon/mysql-tutorial-example-relation-foreign-key-database-funtion-join-table-query-one-namy-nest-41dd09648fbd

pixabay.com

关系数据库的优势包括 连接表查询 ,避免数据重复,避免记录不一致,更好的安全性,迎合未来需求(tech-ict.com)。

在过去的几年里,我通过【MongoDB】构建了几个电子商务或内容共享平台,并意识到对于复杂关系表(如用户、权限、产品或商店关系)的架构和快速移动的特性需求(它会导致记录/数据类型不一致),它并不是一个理想的数据库。每隔几个月就会有新的需求出现,修改脏数据就像从我的屁股上拔牙一样。

内容

  1. 一对一关系
  2. 一对多关系
  3. n-n 关系
  4. 筑巢

备注:

在本例中有一个默认的产品和供应商表

mysql> **SHOW DATABASES;** mysql> **USE yourdatabse;** mysql> **CREATE TABLE product_details (
          productID  INT UNSIGNED   NOT NULL,
                     -- same data type as the parent table
          comment    TEXT  NULL,
                     -- up to 64KB
          PRIMARY KEY (productID),
          FOREIGN KEY (productID) REFERENCES products (productID)
       );**
mysql> **CREATE TABLE IF NOT EXISTS products (
         productID    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
         productCode  CHAR(3)       NOT NULL DEFAULT '',
         name         VARCHAR(30)   NOT NULL DEFAULT '',
         quantity     INT UNSIGNED  NOT NULL DEFAULT 0,
         price        DECIMAL(7,2)  NOT NULL DEFAULT 99999.99,
         supplierID   INT UNSIGNED  NOT NULL DEFAULT 0,
         PRIMARY KEY  (productID)
       );****...**mysql> **UPDATE products SET supplierID = 501;**

1)一对一关系

如果有另外一个表叫做product _ details,用一对一的关系链接到产品上,如图。

写入外键列

mysql> INSERT INTO product_details VALUES (1001, ‘good one’);

按外键列查询关系

mysql> SELECT products.productID,price,product_details.comment
       FROM products 
          ***JOIN product_details ON products.productID = product_details.productID***
       WHERE price < 5;

2)一对多关系

假设每个产品有一个供应商,每个供应商供应一个或多个产品, 供应商-产品是 1-n 关系模型 的基础。要实现 1-n 关系,技术上与 1–1 关系相同,只需确保不超过行与同一产品相关。

创建外键列

products子表的supplierID列的 外键 添加到suppliers父表:

  1. 在产品表中添加 INT 类型的 supplierID
  2. 设置所有 supplierID 的现有记录
  3. 设置 supplierID 为外键列,由相关 产品 表到父 供应商表 mysql > ALTER 表产品 添加列 supplierID INT UNSIGNED NOT NULL
mysql> **UPDATE products SET supplierID = 501;**mysql> **ALTER TABLE products
       ADD FOREIGN KEY (supplierID) REFERENCES suppliers (supplierID);**

写入外键列

这和写一个 INT 列是一样的

mysql> **INSERT INTO products VALUES (1001, 'PEN', 'Pen Red', 5000, 1.23, 503);** Query OK, 1 row affected (0.00 sec)

按外键列查询关系

mysql> SELECT products.name, price, suppliers.name 
       FROM products 
          ***JOIN suppliers ON products.supplierID =  suppliers.supplierID***
       WHERE price < 5;

3)n-n 关系

假设一个产品有很多供应商;一个供应商以所谓的多对多关系供应许多产品。对于多对多的关系,它需要第三表,称为连接表。

创建连接表产品 _ 供应商

mysql> **CREATE TABLE products_suppliers (
         productID   INT UNSIGNED  NOT NULL,
         supplierID  INT UNSIGNED  NOT NULL,
                     -- Same data types as the parent tables
         PRIMARY KEY (productID, supplierID),
                     -- uniqueness
         FOREIGN KEY (productID)  REFERENCES products  (productID),
         FOREIGN KEY (supplierID) REFERENCES suppliers (supplierID)
       );**

插入关系

mysql> **INSERT INTO products_suppliers VALUES (1001, 501), (1001, 503), (1002, 501), (1003, 501), (1004, 502);**

查询 3 相关表

使用SELECTJOIN从 3 个表中查询数据,例如:

mysql> SELECT products.name AS `Product Name`, price, suppliers.name AS `Supplier Name`
       FROM products_suppliers 
          JOIN products  ON products_suppliers.productID = products.productID
          JOIN suppliers ON products_suppliers.supplierID = suppliers.supplierID
       WHERE price < 5 AND products.name = "Pen Red1" AND suppliers.name = "QQ Corp";

摘要

如果您使用多对多关系,您必须引入一个连接表(或连接表),它保存两个参与表的外键,这进一步增加了连接操作的成本。

你可能也喜欢

非常感谢NTU的社区,他们贡献了这么好的教程和有价值的例子。

参考:

https://www . NTU . edu . SG/home/ehchua/programming/SQL/MySQL _ beginner . html

黑客中午是黑客如何开始他们的下午。我们是这个家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除