标签: many-to-many

在这种数据库设计中如何实现多对多关系?

我目前正在开发小型旅行应用程序,用户可以在其中将其他用户的旅行添加到他们的愿望清单中。我在为愿望清单设计数据库时遇到困难。

到目前为止我尝试过的是:

 user (user_id(pk), user_name)

 trip(trip_id(pk), trip_name, user_id(fk))

 wishlist(trip_id(fk), user_id(fk))
Run Code Online (Sandbox Code Playgroud)

但是,由于多个用户可以将多次旅行添加到他们的愿望清单中,如何关联这些关系?

如果用户检索他的个人愿望清单,则可以显示“那个”特定用户的愿望清单中的相关旅行?

mysql rdbms database-design many-to-many

4
推荐指数
1
解决办法
898
查看次数

基于多对多数据透视表的唯一键

我必须管理艺术家和专辑表:

| artists      |  | albums       |  | album_artist |
+--------------+  +--------------+  +--------------+
| id           |  | id           |  | id           |
| artist       |  | album        |  | album_id     |
| created_at   |  | created_at   |  | artist_id    |
| updated_at   |  | updated_at   |  +--------------+
+--------------+  +--------------+
Run Code Online (Sandbox Code Playgroud)

请记住,这是一种多对多关系,我确实需要找到一种方法来使专辑-艺术家对唯一,因为专辑可能具有相同的名称但属于不同的艺术家(例如“Greatest Hits”) ” 2Pac 专辑和 Notorious BIG 的“Greatest Hits”)。

是否有已知的方法/模式来解决这个问题?

mysql database-design many-to-many relations

4
推荐指数
1
解决办法
5907
查看次数

从 N:M 关系中获取给定组的成员

我有这种 N:M 关系:

CREATE TABLE auth_user (
    id integer NOT NULL PRIMARY KEY,
    username character varying(150) NOT NULL UNIQUE
);

CREATE TABLE auth_group (
    id integer NOT NULL PRIMARY KEY,
    name character varying(80) NOT NULL UNIQUE
);

CREATE TABLE auth_user_groups (
    id integer NOT NULL PRIMARY KEY,
    user_id integer REFERENCES auth_user(id) NOT NULL,
    group_id integer REFERENCES auth_group(id) NOT NULL,
    CONSTRAINT user_groups UNIQUE(user_id, group_id)
);

INSERT INTO auth_user VALUES (1, 'user1');
INSERT INTO auth_user VALUES (2, 'user2');
INSERT INTO auth_group VALUES …
Run Code Online (Sandbox Code Playgroud)

postgresql join many-to-many

4
推荐指数
2
解决办法
292
查看次数

许多表之间的多对多?

在此处输入图片说明


TL;DR:我如何在这么多表之间建立多对多关系,它是否可行/推荐?

  • 每种体型都有自己的表格
  • 每个车身类型表中的每辆车都可以有几个特征

正如您从我的“架构”中看到的,每辆车都可以有多个功能,但我需要将功能表连接到几个车身类型表(多对多关系)。我已经考虑了几天,但我仍然不确定如何实现这一点。

为什么所有体型都在单独的表格中?这似乎遵循规范化规则,它还应该加快查询速度,因为我永远不必一次查询多种主体类型。

有可能还是我应该重新考虑一下?我应该制作另一张关于车身类型的表格并将所有汽车组合起来吗?我希望最多有 100 万个条目(所有身体类型相结合)。读取将比写入多得多。

mysql database-design eav subtypes many-to-many

3
推荐指数
1
解决办法
2295
查看次数

复合主键中包含的列是否需要单独的索引?

我有这个 M2M 连接表:

CREATE TABLE [dbo].[RecipientsDonors]
(
  [RecipientId] [int] NOT NULL,
  [DonorId] [int] NOT NULL,
  CONSTRAINT [PK_RecipientsDonors] PRIMARY KEY CLUSTERED 
  (
    [RecipientId] ASC,
    [DonorId] ASC
  )
)
Run Code Online (Sandbox Code Playgroud)

我也有这两个索引:

CREATE NONCLUSTERED INDEX [IX_RecipientsDonors_RecipientId] ON [dbo].[RecipientsDonors]
(
  [RecipientId] ASC
)

CREATE NONCLUSTERED INDEX [IX_RecipientsDonors_DonorId] ON [dbo].[RecipientsDonors]
(
  [DonorId] ASC
)
Run Code Online (Sandbox Code Playgroud)

我使用这两个索引的目的是加快单列查找速度。

既然主键存在,那么索引是否是多余的呢?或者它们是必要的,因为主键包含两列?

index foreign-key primary-key many-to-many

3
推荐指数
1
解决办法
399
查看次数

如何在不在 postgres 中创建大量索引的情况下进行唯一检查

我需要对 INSERT 和 UPDATE 操作实施唯一检查,但我更愿意避免在我的表上创建大量唯一索引(现在约为 12Gb)。现在我有唯一的部分索引并且它工作得很好,除了一件事 - 它需要大量的 SSD 空间。我不需要使用这个索引的 SELECT 操作,我只需要检查数据的唯一性。

我阅读了这个这个讨论,我明白唯一约束和唯一索引之间没有真正的区别,除了部分条件,它只能用于索引。

有没有办法做到这一点?

更新:

我的例子是带有历史选项的多对多关系表的模式。此选项由 2 个附加字段time_fromtime_to. 他们正在存储进入和离开关系的时间。为了数据一致性,我创建了 4 个额外的部分唯一索引(见下文)。

现在该表包含 1 162 010 000 行。以及每个索引的表的整体空间:

vkontakte_wall_post_likes_users - 57 GB
vkontakte_wall_post_like_users_post_id - 24 GB
vkontakte_wall_post_like_users_time_to_2col_uniq - 24 GB
vkontakte_wall_post_like_users_pkey - 24 GB
vkontakte_wall_post_like_users_user_id - 24 GB
vkontakte_wall_post_like_users_time_to_3col_uniq - 846 MB
vkontakte_wall_post_like_users_time_from_2col_uniq - 8192 bytes
vkontakte_wall_post_like_users_id_seq - 8192 bytes
Run Code Online (Sandbox Code Playgroud)

架构:

CREATE TABLE vkontakte_wall_post_likes_users
(
  id integer NOT NULL DEFAULT nextval('vkontakte_wall_post_like_users_id_seq'::regclass),
  post_id integer …
Run Code Online (Sandbox Code Playgroud)

postgresql index-tuning many-to-many

2
推荐指数
1
解决办法
2270
查看次数

如何建模涉及产品、类别和标签的三向关联?

我有以下三个表:

products:
    product_id,
    product_name,
    ...

categories:
    category_id,
    category_name,
    category_parent_id,
    category_priority (for sort ordering),
    .....

labels:
    label_id,
    label_name,
    .....
Run Code Online (Sandbox Code Playgroud)

这个想法是,产品分配给一个类别将各内进行分组类别标签,并以这种方式在网站上列出:

---label1---
product_1
product_2
product_3
---label2---
product_4
product_5
---label3---
product_6
product_7
product_8
product_9
etc.
Run Code Online (Sandbox Code Playgroud)

我不知道如何设计一个关联表(或多个表)将所有这些粘合在一起并防止这样的异常:

---label1---
product_1
product_2
---label2---
product_2
product_3
Run Code Online (Sandbox Code Playgroud)

同时,我想允许一种情况,即当没有足够的产品来证明其合理性时,不会为某个类别分配标签

问题

是否有可能设计一个将它结合在一起的结构,或者我应该“放弃所有希望”并采用这样的方法:

categories:
    category_id,
    category_name,
    category_parent_id,
    categor_is_label,
    category_priority

products:
    product_id,
    product_name,
    ...
Run Code Online (Sandbox Code Playgroud)

加上下面的关联表:

categories_products:
    category_id,
    product_id,
    priority
Run Code Online (Sandbox Code Playgroud)

并处理应用程序中的所有逻辑和异常检查?

我假设用户不能直接访问数据库。

评论和聊天互动

对于那些有兴趣深入讨论手头业务背景的人,您可以访问此聊天室

mysql foreign-key database-design primary-key many-to-many

2
推荐指数
1
解决办法
1661
查看次数

使用 JSONB 列或另一个表来保存关系

我试图在这里彻底搜索,但没有找到任何答案。

我有一个 PostgreSQL 数据库,它有两个主表:

  • 文件
  • 用户

这两个表有不同的关系。用户可以:

  • 喜欢
  • 书签稍后阅读
  • 节省

... 一份文件。

问题是我应该如何保存这些关系?

根据我使用 MySQL 的经验,显而易见的方法是为这些多对多关系创建表,包含user_iddocument_id.

但是,因为我们使用PostgreSQL,它具有惊人的JSON支持,我们想也许更好的做法是有一个user_document表,其中包含user_iddocument_idJSON列包含所有关系。

JSON 将是这样的:

{
   'follow' : {'date' : 1523517140, 'doesFollow' : 't'}, 
   'bookmark' : {'date' : null, 'doesBookmark' : 'f'},
   ....
}
Run Code Online (Sandbox Code Playgroud)

我对 PostgreSQL 的经验几乎为零,我不知道在 JSONB 列上查询的性能。而且我不知道这种方法在 PostgreSQL 中是否有意义。但它似乎没问题,如果它没有任何问题,也许它比第一种正常方法更可取。

postgresql database-design json many-to-many

2
推荐指数
1
解决办法
3129
查看次数

有效地从 am:n 表中返回两个聚合数组

我有一个表,用于表上的多对多关系users来表示用户之间的跟随关系:

CREATE TABLE users (
    id text PRIMARY KEY,
    username text NOT NULL
);

CREATE TABLE followers (
    userid text,
    followid text,
    PRIMARY KEY (userid, followid),
    CONSTRAINT followers_userid_fk   FOREIGN KEY (userid)   REFERENCES users (id),
    CONSTRAINT followers_followid_fk FOREIGN KEY (followid) REFERENCES users (id)
);

CREATE INDEX followers_followid_idx ON followers (followid);
Run Code Online (Sandbox Code Playgroud)

当我想使用与用户相关的数据创建 JSON 响应时,我有两种情况:

  • 通过 id 请求单个用户,
  • 通过 id 列表请求用户对象数组

用户数据对象应包含两个用户 ID 数组,一个是他们关注的用户,另一个是关注他们的用户。为了创建这两个字段,我使用了以下SELECT语句。

DECLARE follows RECORD;
SELECT  array (select followid FROM followers where userid = Puserid) AS following, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view many-to-many postgresql-10

2
推荐指数
1
解决办法
1120
查看次数

多对多 - 概念

我知道有很多关于多对多关系的问题,但似乎没有一个对我有用,因为它更多地是关于概念而不是代码的问题。所以我需要澄清一下如何实现我的想法。

我正在尝试制作乐高数据库。我有可以有很多小人仔的套装。某些 MINIFIGURES 也可以出现在许多 SETS 中。我是这样做的,在 Excel(csv) 文件中。它是 SETS “表”。

Id  Set_Name                        Set_Id   Minifigures_List
1   Spider-Man's Doc Ock Ambush     6873     Doc Ock, Spider-Man, Iron Fist
2   Spider-Man: Spider-Cycle Chase  76004    Spider-Man, Venom, Nick Fury
3   Electro                         5002125  Electro
.....
Run Code Online (Sandbox Code Playgroud)

我的数据库实现的第一步是创建一个SETS表。

CREATE TABLE Sets (
ID int NOT NULL AUTO_INCREMENT,
Set_Name varchar(255),
Set_Id varchar(255),
);
Run Code Online (Sandbox Code Playgroud)

然后插入数据:

Insert into Sets (Set_Name, Set_Id)
VALUES ('Spidermans Doc Ock Ambush' , '6837'), 
('Spider-Man: Spider-Cycle Chase' , '76004')
('Electro', '5002125')
;
...
Run Code Online (Sandbox Code Playgroud)

下一步是创建一个MINIFIGS …

schema database-design many-to-many

-1
推荐指数
1
解决办法
179
查看次数