小编Mic*_*ood的帖子

数据库设计:规范化“(多对多)对多”关系

精简版

我必须在现有的多对多连接中为每对添加固定数量的附加属性。跳到下图,从优点和缺点来看,选项 1-4 中哪一个是通过扩展基本案例来实现这一目标的最佳方式?或者,有没有更好的选择我在这里没有考虑过?

更长的版本

我目前通过中间连接表有两个多对多关系的表。我现在需要添加指向属于这对现有对象的属性的附加链接。对于每一对,我有固定数量的这些属性,尽管属性表中的一个条目可能适用于多对(甚至对于一对可以多次使用)。我正在尝试确定执行此操作的最佳方法,并且无法理清如何看待这种情况。从语义上讲,我似乎可以将其描述为以下任何一项:

  1. 一对链接到一组固定数量的附加属性
  2. 一对链接到许多其他属性
  3. 许多(两个)对象链接到一组属性
  4. 许多对象链接到许多属性

例子

我有两种对象类型,X 和 Y,每个都有唯一的 ID,还有一个objx_objy带有列x_id和的链接表y_id,它们一起构成了链接的主键。每个 X 可以与许多 Y 相关,反之亦然。这是我现有的多对多关系的设置。

基本情况

基本情况

现在另外我在另一个表中定义了一组属性,以及一组条件,在这些条件下给定的 (X,Y) 对应该具有属性 P。条件的数量是固定的,所有对都相同。他们基本上说“在情况 C1 中,对 (X1,Y1) 具有属性 P1”,“在情况 C2 中,对 (X1,Y1) 具有属性 P2”,依此类推,对于连接中的每对的三种情况/条件桌子。

选项1

在我目前的状况正好有三个这样的条件,我也没有理由认为增加,所以一种可能性是添加列c1_p_idc2_p_id以及c3_p_idfeatx_featy,指定用于给定x_idy_id,其性能p_id在每个三种情况使用.

选项1

这对我来说似乎不是一个好主意,因为它使 SQL 复杂化以选择应用于功能的所有属性,并且不容易扩展到更多条件。但是,它确实强制要求每个 (X,Y) 对有一定数量的条件。事实上,这是这里唯一的选择。

选项 2

创建条件表cond,将条件ID添加到连接表的主键中。

选项 2

这样做的一个缺点是它没有指定每对条件的数量。另一个是,当我只考虑最初的关系时,例如

SELECT objx.*, objy.* FROM objx
  INNER JOIN objx_objy ON objx_objy.x_id = objx.id
  INNER …
Run Code Online (Sandbox Code Playgroud)

database-design relational-theory

14
推荐指数
1
解决办法
5877
查看次数

string_agg 没有记录时返回空字符串

我正在尝试在格式为 PostgreSQL 查询中返回一个文本字段

'stringOne' || string_agg(field, ',') || 'stringTwo'
Run Code Online (Sandbox Code Playgroud)

对于 group 子句中的某些元素, wherefield始终为 null。我想要并期望stringOnestringTwo在这种情况下结束,但我得到NULL.

为什么会这样,我如何完成我想要做的事情?

例子

假设我有桌子

foo                 bar
+----+--------+     +----+-------+--------------+
| id | name   |     | id | fooid | baz          |
+----+--------+     +----+-------+--------------+
|  1 | FooOne |     |  1 |     1 | FooOneBazOne |
|  2 | FooTwo |     |  2 |     1 | FooTwoBazTwo |
+----+--------+     +----+-------+--------------+
Run Code Online (Sandbox Code Playgroud)

我运行查询

SELECT
  foo.name AS foo,
  'Bazzes: ' || string_agg(bar.baz, ', ') AS bazzes …
Run Code Online (Sandbox Code Playgroud)

postgresql null aggregate concat

8
推荐指数
1
解决办法
1万
查看次数