我是一个postgres新手,我正在努力实现这个:
id_name
varchar列,其值为jones
或adams
similar_artists
列,应该是包含id_name
值的varchars数组similar_artists
添加id_name时。另一行在其similar_artists
中自动添加第一个id_name(即,如果艺术家A
在B
中有similar_artists
,则艺术家B
必须A
在他的similar_artists
中也是如此。similar_artists
列在逻辑上包含每行的可变数量的条目(例如,艺术家A
我有类似的艺术家B
,C
和艺术家M
有P
,O
,X
,Y
,Z
)实现此目的的最佳方法是什么?我目前正在努力使用触发器程序和数组,因为postgres本身支持它们但不能确定这是否是明智的方式。
答案 0 :(得分:1)
触发器是一种有效的方法,虽然这肯定可以用于数组我怀疑你会发现使用关联(也称为联结)表是一种更标准和更推荐的方法来实际保持关系数据
基本上,您希望将您的艺术家表及其信息与您现有的相似,但请删除similar_artists
列。对SERIAL PRIMARY KEY
使用id_name
而不是字符串也是一个更好的主意。
然后,您将制作第二张表,表示您的相似艺术家关系。第二个表可以用几种不同的方式创建,每种方式都有优点和缺点。
一种方法是使用三列:一个唯一的ID(在PostgreSQL中使用串行主键并不是一个坏主意)和两列代表每个都有外键约束的艺术家(使用REFERENCES
)指向艺术家表中使用的主键。如果你这样做,你只需要一个条目来代表两位艺术家之间的联系;你必须使逻辑稍微复杂一点(也就是检查两列),但由于两个列总是可以在一个查询中获取,因此不会对性能产生巨大影响。您可以稍微修改一下,以牺牲空间为代价来简化逻辑,方法是为每个艺术家包含两行,并且只跟踪每一行的单向关系。
另一种方式是使用与上述相同的唯一ID,第二整数关系ID和表示具有外键约束等的艺术家的第三列来使其具有三列,如上所述。在这种情况下,需要两行来联系两位艺术家,并通过将他们加入一个共同的关系来工作。如果您有更多与这两者相关的艺术家,那么只需为每个映射添加一个新行即可。对于很多与大球相关的艺术家来说,这种方法比上面解释的方法更有效。
除此之外还有其他方法,但你明白了。关键点在于,通过在这些表中使用外键约束,您可以让数据库系统为您完成更多工作。
然而,您选择将其布局,一旦您设计了表格,您就可以构建触发功能,以根据设计执行额外的INSERT
或两个。在尝试编写触发器函数之前,设计这些表并仔细确定您的方法非常重要。如果您不熟悉数据库规范化的概念,那么在您对表格设计做出最终决定之前,您还需要参加速成课程。