我目前正在开发小型旅行应用程序,用户可以在其中将其他用户的旅行添加到他们的愿望清单中。我在为愿望清单设计数据库时遇到困难。
到目前为止我尝试过的是:
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)
但是,由于多个用户可以将多次旅行添加到他们的愿望清单中,如何关联这些关系?
如果用户检索他的个人愿望清单,则可以显示“那个”特定用户的愿望清单中的相关旅行?
我必须管理艺术家和专辑表:
| 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”)。
是否有已知的方法/模式来解决这个问题?
我有这种 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) TL;DR:我如何在这么多表之间建立多对多关系,它是否可行/推荐?
正如您从我的“架构”中看到的,每辆车都可以有多个功能,但我需要将功能表连接到几个车身类型表(多对多关系)。我已经考虑了几天,但我仍然不确定如何实现这一点。
为什么所有体型都在单独的表格中?这似乎遵循规范化规则,它还应该加快查询速度,因为我永远不必一次查询多种主体类型。
有可能还是我应该重新考虑一下?我应该制作另一张关于车身类型的表格并将所有汽车组合起来吗?我希望最多有 100 万个条目(所有身体类型相结合)。读取将比写入多得多。
我有这个 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)
我使用这两个索引的目的是加快单列查找速度。
既然主键存在,那么索引是否是多余的呢?或者它们是必要的,因为主键包含两列?
我需要对 INSERT 和 UPDATE 操作实施唯一检查,但我更愿意避免在我的表上创建大量唯一索引(现在约为 12Gb)。现在我有唯一的部分索引并且它工作得很好,除了一件事 - 它需要大量的 SSD 空间。我不需要使用这个索引的 SELECT 操作,我只需要检查数据的唯一性。
我阅读了这个和这个讨论,我明白唯一约束和唯一索引之间没有真正的区别,除了部分条件,它只能用于索引。
有没有办法做到这一点?
更新:
我的例子是带有历史选项的多对多关系表的模式。此选项由 2 个附加字段time_from
和time_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) 我有以下三个表:
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)
并处理应用程序中的所有逻辑和异常检查?
我假设用户不能直接访问数据库。
对于那些有兴趣深入讨论手头业务背景的人,您可以访问此聊天室。
我试图在这里彻底搜索,但没有找到任何答案。
我有一个 PostgreSQL 数据库,它有两个主表:
这两个表有不同的关系。用户可以:
... 一份文件。
问题是我应该如何保存这些关系?
根据我使用 MySQL 的经验,显而易见的方法是为这些多对多关系创建表,包含user_id
和document_id
.
但是,因为我们使用PostgreSQL,它具有惊人的JSON支持,我们想也许更好的做法是有一个user_document
表,其中包含user_id
,document_id
和JSON列包含所有关系。
JSON 将是这样的:
{
'follow' : {'date' : 1523517140, 'doesFollow' : 't'},
'bookmark' : {'date' : null, 'doesBookmark' : 'f'},
....
}
Run Code Online (Sandbox Code Playgroud)
我对 PostgreSQL 的经验几乎为零,我不知道在 JSONB 列上查询的性能。而且我不知道这种方法在 PostgreSQL 中是否有意义。但它似乎没问题,如果它没有任何问题,也许它比第一种正常方法更可取。
我有一个表,用于表上的多对多关系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 数组,一个是他们关注的用户,另一个是关注他们的用户。为了创建这两个字段,我使用了以下SELECT
语句。
DECLARE follows RECORD;
SELECT array (select followid FROM followers where userid = Puserid) AS following, …
Run Code Online (Sandbox Code Playgroud) 我知道有很多关于多对多关系的问题,但似乎没有一个对我有用,因为它更多地是关于概念而不是代码的问题。所以我需要澄清一下如何实现我的想法。
我正在尝试制作乐高数据库。我有可以有很多小人仔的套装。某些 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 …
many-to-many ×10
mysql ×4
postgresql ×4
foreign-key ×2
primary-key ×2
eav ×1
index ×1
index-tuning ×1
join ×1
json ×1
performance ×1
rdbms ×1
relations ×1
schema ×1
subtypes ×1
view ×1