数据库设计可存储订购的用户照片?

时间:2018-10-20 03:48:51

标签: sql postgresql

例如,

用户有[image1.jpg, image2.jpg ,image3.jpg]

用户可以将其重新排序为[image2.jpg, image1.jpg, image3.jpg],添加到末尾,然后从任意位置删除

我可以想到两种存储它们的方法:

  1. 只需以Array类型存储在数据库中即可。当用户添加/删除/重新排序照片时,覆盖数据库中的整个阵列
  2. 使用position列存储许多照片行,这些行属于1个用户。插入时添加到最后一个位置+1。删除时,必须在删除位置后向后移动位置-1

推荐的设计是什么?

2 个答案:

答案 0 :(得分:0)

我认为SQL中最自然的设计应该是一个单独的表:

acceptedFiles

您已经注意到,如果您希望职位空缺且有序,那么您需要更新所有行。

这有几个功能/优点:

  • 您可以将逻辑放入触发器或存储过程中,使其位于数据库中。
  • 您可以添加有关图像的其他信息,例如图像的添加日期或软删除。
  • 数据库可以防止图像重复。

另一种选择是将这些作为数组存储在create table userImages ( userImageId serial, userId int references users(userId), image varchar(255), position int ); 中的一行中。为了保持顺序,您基本上需要在应用程序中执行此操作。也就是说,读取数组,进行删除,插入和重新排序,然后再次保存该行。

这有几个功能/缺点,例如:

  • 应用程序必须负责该列,而不是数据库。
  • 没有地方放置有关图像的其他信息。

我通常偏向于第一种方法,但是在某些情况下,第二种方法是相当合理的。

答案 1 :(得分:-1)

我认为是。如果照片按某种属性排序(例如上次编辑时间),则只需按属性选择XXX排序即可。 如果用户需要订购照片,则必须使用“位置”列。