Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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/2/ionic-framework/2.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_Many To Many_Entity Relationship - Fatal编程技术网

多个表中的MySQL收藏夹项

多个表中的MySQL收藏夹项,mysql,sql,many-to-many,entity-relationship,Mysql,Sql,Many To Many,Entity Relationship,当有多个表可供选择时,存储收藏夹的最有效方法是什么 例如:您有一个用户(ID,姓名,…)、食物(ID,卡路里,…)、鸡尾酒(ID,酒精,…)和糖果(ID,姓名,…),用户可以从这些表中喜爱多个元素。解决这个问题的最好办法是什么 我的想法是创建一个多对多关系,在这里我让用户与上面的每个表(用户食物、用户鸡尾酒、用户糖果)建立关系,或者创建一个我最喜欢的表,在这里我有上面提到的所有表的外键 我想后者不是最佳解决方案 您基本上有两种选择: create table favorites ( fa

当有多个表可供选择时,存储收藏夹的最有效方法是什么

例如:您有一个用户(ID,姓名,…)、食物(ID,卡路里,…)、鸡尾酒(ID,酒精,…)和糖果(ID,姓名,…),用户可以从这些表中喜爱多个元素。解决这个问题的最好办法是什么

我的想法是创建一个多对多关系,在这里我让用户与上面的每个表(用户食物、用户鸡尾酒、用户糖果)建立关系,或者创建一个我最喜欢的表,在这里我有上面提到的所有表的外键


我想后者不是最佳解决方案

您基本上有两种选择:

create table favorites (
    favoritesId int auto_increment primary key,
    userId,
    which varchar(255),
    id int,
    foreign key (userId) references users(userId)
);
这是简短、简洁的,并允许您添加新实体

或者,您可以单独列出每一项:

create table favorites (
    favoritesId int auto_increment primary key,
    foodId int,
    cocktailsId int,
    . . .
    foreign key (userId) references users(userId),
    foreign key (foodId) references foods(foodId),
    foreign key (cocktailsId) references cocktails(cocktailsId),
    . . .
);

这不太简洁,但允许添加显式外键引用。如果需要的话,它还可以方便地在一行上表示多个收藏夹。

您基本上有两个选项:

create table favorites (
    favoritesId int auto_increment primary key,
    userId,
    which varchar(255),
    id int,
    foreign key (userId) references users(userId)
);
这是简短、简洁的,并允许您添加新实体

或者,您可以单独列出每一项:

create table favorites (
    favoritesId int auto_increment primary key,
    foodId int,
    cocktailsId int,
    . . .
    foreign key (userId) references users(userId),
    foreign key (foodId) references foods(foodId),
    foreign key (cocktailsId) references cocktails(cocktailsId),
    . . .
);

这不太简洁,但允许添加显式外键引用。如果需要的话,它还可以方便地在一行上表示多个收藏夹。

您可以创建一个
收藏夹
表 并从另一个四表中添加
外键

它看起来像:

CREATE TABLE User (`ID` int not null, `Name` varchar(5)) ;
INSERT INTO User (`ID`, `Name`) 
  VALUES (1, 'Jogn'), (2, 'Henry') ; 

CREATE TABLE Food (`ID` int, `calories` int) ; 
INSERT INTO Food (`ID`, `calories`) 
  VALUES (1, 123), (2, 456) ; 

CREATE TABLE Cocktails (`ID` int, `Alcoholic` int) ; 
INSERT INTO Cocktails (`ID`, `Alcoholic`) 
  VALUES (1, 30), (2, 40) ; 

CREATE TABLE Sweets (`ID` int, `Name` varchar(5)) ; 
INSERT INTO Sweets (`ID`, `Name`) 
  VALUES (1, 'candy'), (2, 'cake') ;


CREATE TABLE Favorite
    (`ID` int
     , `UserID` int not null
     , `FoodID` int 
     , `CocktailsID` int
     , `SweetsID` int
    )
;

ALTER TABLE `User` ADD CONSTRAINT PK_User PRIMARY KEY (`ID`);
ALTER TABLE `Food` ADD CONSTRAINT PK_Food PRIMARY KEY (`ID`);
ALTER TABLE `Cocktails` ADD CONSTRAINT PK_Cocktails PRIMARY KEY (`ID`);
ALTER TABLE `Sweets` ADD CONSTRAINT PK_Sweets PRIMARY KEY (`ID`);

ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_User
  FOREIGN KEY (`UserID`) REFERENCES `User`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Food
  FOREIGN KEY (`FoodID`) REFERENCES `Food`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Cocktails
  FOREIGN KEY (`CocktailsID`) REFERENCES `Cocktails`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Sweetss
  FOREIGN KEY (`SweetsID`) REFERENCES `Sweets`(`ID`);   

INSERT INTO Favorite 
    (`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
    (1, 1, '1', NULL, NULL),
    (2, 2, NULL, '2', NULL),
    (3, 1, NULL, NULL, '1')
;
当我为糖果插入不存在值时

INSERT INTO Favorite 
    (`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
    (3, 1, NULL, NULL, 4)
;
它将抛出异常

Cannot add or update a child row: a foreign key constraint fails (`db_9_1a5d3f`.`favorite`, CONSTRAINT `FK_Sweetss` FOREIGN KEY (`SweetsID`) REFERENCES `sweets` (`ID`))

您可以通过此SQL脚本查询它们(可能创建一个视图):



如果您想要测试:

您可以创建一个
收藏夹
表 并从另一个四表中添加
外键

它看起来像:

CREATE TABLE User (`ID` int not null, `Name` varchar(5)) ;
INSERT INTO User (`ID`, `Name`) 
  VALUES (1, 'Jogn'), (2, 'Henry') ; 

CREATE TABLE Food (`ID` int, `calories` int) ; 
INSERT INTO Food (`ID`, `calories`) 
  VALUES (1, 123), (2, 456) ; 

CREATE TABLE Cocktails (`ID` int, `Alcoholic` int) ; 
INSERT INTO Cocktails (`ID`, `Alcoholic`) 
  VALUES (1, 30), (2, 40) ; 

CREATE TABLE Sweets (`ID` int, `Name` varchar(5)) ; 
INSERT INTO Sweets (`ID`, `Name`) 
  VALUES (1, 'candy'), (2, 'cake') ;


CREATE TABLE Favorite
    (`ID` int
     , `UserID` int not null
     , `FoodID` int 
     , `CocktailsID` int
     , `SweetsID` int
    )
;

ALTER TABLE `User` ADD CONSTRAINT PK_User PRIMARY KEY (`ID`);
ALTER TABLE `Food` ADD CONSTRAINT PK_Food PRIMARY KEY (`ID`);
ALTER TABLE `Cocktails` ADD CONSTRAINT PK_Cocktails PRIMARY KEY (`ID`);
ALTER TABLE `Sweets` ADD CONSTRAINT PK_Sweets PRIMARY KEY (`ID`);

ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_User
  FOREIGN KEY (`UserID`) REFERENCES `User`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Food
  FOREIGN KEY (`FoodID`) REFERENCES `Food`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Cocktails
  FOREIGN KEY (`CocktailsID`) REFERENCES `Cocktails`(`ID`); 
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Sweetss
  FOREIGN KEY (`SweetsID`) REFERENCES `Sweets`(`ID`);   

INSERT INTO Favorite 
    (`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
    (1, 1, '1', NULL, NULL),
    (2, 2, NULL, '2', NULL),
    (3, 1, NULL, NULL, '1')
;
当我为糖果插入不存在值时

INSERT INTO Favorite 
    (`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
    (3, 1, NULL, NULL, 4)
;
它将抛出异常

Cannot add or update a child row: a foreign key constraint fails (`db_9_1a5d3f`.`favorite`, CONSTRAINT `FK_Sweetss` FOREIGN KEY (`SweetsID`) REFERENCES `sweets` (`ID`))

您可以通过此SQL脚本查询它们(可能创建一个视图):


如果您想要测试:

  • 为所有项目类型创建一个包含一列的
    收藏夹

    CREATE TABLE favorite
                 (user integer,
                  item integer,
                  item_type varchar(256),
                  PRIMARY KEY (user,
                               item,
                               item_type),
                  FOREIGN KEY (user)
                              REFERENCES user
                                         (id));
    
    项目
    是相应表格中的ID(
    食品
    鸡尾酒
    甜味

    项目类型
    需要确保唯一性,因为对于不同类型的两个项目,
    项目
    可以相等。例如,表名(
    'food'
    'cockbox'
    'sweet'
    )。它还可以作为一个辅助列来指定要指向的项目
    项目
    的类型

    优点:

    • 当引入新的项类型时,不需要更改架构
    • 添加和删除收藏夹不需要额外的逻辑,每个收藏夹一行——很简单
    缺点:

    • 不能在
      上添加外键约束,因为它每行引用不同的表。您必须实现触发器以确保引用完整性
  • 创建一个
    收藏夹
    表,为每种项目类型创建一列

    CREATE TABLE favorite
                 (id integer
                     AUTO_INCREMENT,
                  user integer,
                  food integer,
                  cocktail integer,
                  sweet integer,
                  PRIMARY KEY (id),
                  FOREIGN KEY (food)
                              REFERENCES food
                                         (id),
                  FOREIGN KEY (cocktail)
                              REFERENCES cocktail
                                         (id),
                  FOREIGN KEY (sweet)
                              REFERENCES sweet
                                         (id),
                  UNIQUE (user,
                          food),
                  UNIQUE (user,
                          cocktail),
                  UNIQUE (user,
                          sweet));
    
    优点:

    • 可以使用外键约束
    缺点:

    • 当引入新的项类型时,需要更改架构
    • 如果用户可以拥有任意数量的每种项目类型的收藏夹,这会变得有点复杂。然后用户需要有更多的行。即,当添加新收藏夹时,必须检查是否可以更新现有行,其中收藏夹类型的相应列为null,或者是否需要插入新行,因为用户的所有行中的相应列都不是null。删除收藏夹时,可能应删除所有
      NULL
      s行。这需要应用程序中的额外逻辑,或者必须封装在触发器或过程中
    如果每个项目类型只能有一个收藏夹,那么这可能是一个不错的选择

  • 引入一个通用的
    项目
    表,并让不同的项目表引用该通用表。收藏夹表将仅引用常用表

    CREATE TABLE item
                 (id integer
                     AUTO_INCREMENT,
                  PRIMARY KEY (id));
    
    INSERT INTO item
                SELECT NULL
                       FROM food
                UNION ALL
                SELECT NULL
                       FROM cocktail
                UNION ALL
                SELECT NULL
                       FROM sweet;
    
    ALTER TABLE food
                ADD (item integer,
                     FOREIGN KEY (item)
                                 REFERENCES item
                                           (id));
    ALTER TABLE cocktail
                ADD (item integer,
                     FOREIGN KEY (item)
                                 REFERENCES item
                                           (id));
    ALTER TABLE sweet
                ADD (item integer,
                     FOREIGN KEY (item)
                                 REFERENCES item
                                           (id));
    
    UPDATE food
           SET item = (SELECT count(*)
                              FROM food s
                              WHERE s.id <= food.id);
    UPDATE cocktail
           SET item = (SELECT count(*)
                              FROM cocktail s
                              WHERE s.id <= food.id)
                      + (SELECT count(*)
                                FROM food);
    UPDATE sweet
           SET item = (SELECT count(*)
                              FROM sweet s
                              WHERE s.id <= food.id)
                      + (SELECT count(*)
                                FROM food)
                      + (SELECT count(*)
                                FROM cocktail);
    
    ALTER TABLE food
                MODIFY item integer
                            NOT NULL;
    ALTER TABLE cocktail
                MODIFY item integer
                            NOT NULL;
    ALTER TABLE sweet
                MODIFY item integer
                            NOT NULL;
    
    CREATE TABLE favorite
                 (user integer,
                  item integer,
                  PRIMARY KEY (user,
                               item),
                  FOREIGN KEY (user)
                              REFERENCES user
                                         (id),
                  FOREIGN KEY (item)
                              REFERENCES item
                                         (id));
    
    创建表项
    (id)整数
    自动增量,
    主键(id));
    插入项目
    选择空值
    来自食物
    联合所有
    选择空值
    鸡尾酒
    联合所有
    选择空值
    来自甜蜜;
    改变餐桌上的食物
    添加(项目整数,
    外键(项目)
    参考项目
    (id));
    改变餐桌鸡尾酒
    添加(项目整数,
    外键(项目)
    参考项目
    (id));
    改变餐桌甜点
    添加(项目整数,
    外键(项目)
    参考项目
    (id));
    更新食物
    设置项=(选择计数(*)
    从食物到食物
    s.id在哪里
    
  • 为所有项目类型创建一个包含一列的
    收藏夹

    CREATE TABLE favorite
                 (user integer,
                  item integer,
                  item_type varchar(256),
                  PRIMARY KEY (user,
                               item,
                               item_type),
                  FOREIGN KEY (user)
                              REFERENCES user
                                         (id));
    
    项目
    是相应表格中的ID(
    食品
    鸡尾酒
    甜味

    item\u type
    需要确保唯一性,因为
    item
    对于两种不同类型的项目可以相等。例如,表名(
    'food'
    'cockbox'
    'sweet'
    )。它还可以作为一个辅助列来指定
    item
    指向的项目类型

    优点:

    • 当引入新的项类型时,不需要更改架构
    • 添加和删除收藏夹不需要额外的逻辑,每个收藏夹一行——很简单
    缺点:

    • 您不能在
      上添加外键约束,因为它每行引用不同的表。您必须执行