0

在开发过程中,我正在添加每个主要添加的数据库。我最新的是一个图片库程序,我在问自己所有这些问题/

可能表格的简化版本

Image (id, name, path, state)
Gallery (id, name, path, state)
Image Gallery Relationship (image id, gallery id)
Image User Relationship (image id, user id)
Image Venue Relationship (image id, venue id)
Image Event Relationship (image id, event id)
Gallery User Relationship (image id, user id)
Gallery Venue Relationship (image id, venue id)
Gallery Event Relationship (image id, event id) 

我认为同一张照片可以由用户拥有/拍摄,分配给活动和场地,在用户照片的画廊中,在与活动相关的画廊中,在与场地相关的画廊中。

现在,如果我想使用同一个数据库来存储用户的个人资料图片,我会为此创建另一个表吗?我应该将个人资料图片 ID 放入用户表中吗?我应该将照片所有权放入图像表中吗?但很可能大部分图片不会由用户上传。活动或场地的“个人资料图片”怎么样?还是画廊的封面图?我创建了很多表还是不够?

旁注通常在创建列时,我认为如果它是必需的单值属性,则将其放在表中,如果它可能为空或与多个事物相关联,则它可能应该在另一个表中。但是我现在有 60 张桌子,而且我的程序还没有完成一半。

这些天我真的很缺乏导师,所以非常感谢所有的建议

图片相关,这是我当前的数据库 我当前的数据库

另外,如果我的问题可以更概括地帮助未来有类似问题的人,我不介意编辑

4

2 回答 2

2

无论你决定什么,你都应该把它框起来,挂在画廊里。

您可能想要简化它。以不同的方式看待它:考虑一个可能与图像相关联的中心事物表,然后找到这些事物的共同点。添加一个type字段 ( gallery, venue, event)。也许您会添加一两个额外的字段,但最终它将大大简化您的工作和数据库。我正在对我正在创造的东西进行同样的灵魂探索。

于 2011-03-24T05:29:19.897 回答
1

这完全取决于所有对象之间的确切关系。你的描述有点模糊,所以我将在这里做一些假设,但这是我从中得到的:

主要规则:只有在多对多关系时才使用连接表(如 Gallery_Image_Relationship (gallery_id, image_id));我怀疑gallery-image 就是一个很好的例子。一个画廊包含许多图像,一个图像可以属于许多画廊。但是,对于其他任何事情,它们只是不必要的复杂化。

对于其余的关系,只需在其中一个表中放置一个外键。如果是一对多,那么表格很明显:一个用户可以上传很多张图片,但是一张图片只能由一个用户上传?然后您的图像表将获得一个 uploader_id 列。

也就是说,这将在您的数据库中变成这样:

users:
  id,
  name,
  profile_image_id, #A user can only have one profile pic (at a time)
  etc.

images:
  id,
  name,
  uploader_id, #It can only be uploded by one person
  etc.

galleries:
  id,
  name,
  cover_image_id,
  etc.

images_galleries: # 'cause images:galleries is many:many
  image_id,
  gallery_id

(我不知道 SO 认为那是什么语言。它突出显示user, by,is和撇号...)

当您尝试将图像与场地和/或活动联系起来时,它会变得更加主观。您是否希望您的大部分/所有图像都是特定事件的?如果是这样,那么您可能需要在图像表中添加一个 event_id 列。场地也是如此。

但是,如果您期望大量图像不属于任何特定事件,那么这些列只会浪费数据库空间。那么画廊通常会与单个活动/场地相关联吗?如果是这样,那么这就是你的外键所属的地方。

如果这些都不太合适,那么您的连接表仍然是一种选择。我怀疑标准化顽固分子会批准,但有时你不需要挑剔。

希望有帮助!

于 2011-03-24T05:33:56.397 回答