Postgres:引用某一行中的其他特定行

时间:2016-07-24 01:11:45

标签: sql postgresql

我是一个postgres新手,我正在努力实现这个:

  • 我有一张艺术家及其信息(出生,死亡,风格等)的表格。
  • 每行都有一个唯一的id_name varchar列,其值为jonesadams
  • 我有similar_artists列,应该是包含id_name值的varchars数组
  • 我需要确保在某行中向similar_artists添加id_name时。另一行在其similar_artists中自动添加第一个id_name(即,如果艺术家AB中有similar_artists,则艺术家B必须A在他的similar_artists中也是如此。
  • similar_artists列在逻辑上包含每行的可变数量的条目(例如,艺术家A我有类似的艺术家BC和艺术家MPOXYZ

实现此目的的最佳方法是什么?我目前正在努力使用触发器程序和数组,因为postgres本身支持它们但不能确定这是否是明智的方式。

1 个答案:

答案 0 :(得分:1)

触发器是一种有效的方法,虽然这肯定可以用于数组我怀疑你会发现使用关联(也称为联结)表是一种更标准和更推荐的方法来实际保持关系数据

基本上,您希望将您的艺术家表及其信息与您现有的相似,但请删除similar_artists列。对SERIAL PRIMARY KEY使用id_name而不是字符串也是一个更好的主意。

然后,您将制作第二张表,表示您的相似艺术家关系。第二个表可以用几种不同的方式创建,每种方式都有优点和缺点。

一种方法是使用三列:一个唯一的ID(在PostgreSQL中使用串行主键并不是一个坏主意)和两列代表每个都有外键约束的艺术家(使用REFERENCES )指向艺术家表中使用的主键。如果你这样做,你只需要一个条目来代表两位艺术家之间的联系;你必须使逻辑稍微复杂一点(也就是检查两列),但由于两个列总是可以在一个查询中获取,因此不会对性能产生巨大影响。您可以稍微修改一下,以牺牲空间为代价来简化逻辑,方法是为每个艺术家包含两行,并且只跟踪每一行的单向关系。

另一种方式是使用与上述相同的唯一ID,第二整数关系ID和表示具有外键约束等的艺术家的第三列来使其具有三列,如上所述。在这种情况下,需要两行来联系两位艺术家,并通过将他们加入一个共同的关系来工作。如果您有更多与这两者相关的艺术家,那么只需为每个映射添加一个新行即可。对于很多与大球相关的艺术家来说,这种方法比上面解释的方法更有效。

除此之外还有其他方法,但你明白了。关键点在于,通过在这些表中使用外键约束,您可以让数据库系统为您完成更多工作。

然而,您选择将其布局,一旦您设计了表格,您就可以构建触发功能,以根据设计执行额外的INSERT或两个。在尝试编写触发器函数之前,设计这些表并仔细确定您的方法非常重要。如果您不熟悉数据库规范化的概念,那么在您对表格设计做出最终决定之前,您还需要参加速成课程。