摄影网站的关系数据库设计

时间:2011-08-18 15:31:34

标签: mysql database-design relational-database

我正在为摄影网站创建一个数据库,我希望它允许三个主要内容 -

允许所有者/管理员创建客户帐户和凭据,
指定哪些照片应该进入网站上的三个不同的投资组合画廊,以及,
在他们登录时向他们显示唯一客户的照片(以及他们的照片!)。

这是我的第一个数据库设计 - 根据下面的回复,我添加了重点;)并编辑了如下设计。

图片
image_id,
文件名,
描述,
CLIENT_ID,
date_uploaded,

用户/客户
CLIENT_ID,
CLIENT_NAME
用户名,
密码,

案例
portfolio_id,
PORTFOLIO_NAME,

PORTFOLIO_IMAGES
ID,
image_id,
portfolio_id,

我是否认为PORTFOLIO_IMAGES中的最终ID允许我在多个图库中显示一个图像? 感谢

4 个答案:

答案 0 :(得分:2)

因为这是你的第一个数据库设计,正如你在评论中提到的那样,缺少必要的东西:ER-Diagram。这有助于理解正在发生的事情。

ER-图

enter image description here

同义词:用户=帐户,图片=照片,图库=投资组合
已知角色:“管理员”,“客户”
权利示例:“创建帐户”,“删除帐户”,“观看图片”,“添加图库”,“删除图库”,“上传图片”,“删除图片”,... < / p>

表格设计

用户

  • ID
  • 名称
  • 密码

图片

  • ID
  • USER_ID
  • 文件名
  • 描述
  • UPLOAD_DATE

<强> IMAGE_GALLERY

  • image_id
  • gallery_id

<强>图库

  • ID
  • 名称

<强> USER_ROLE

  • USER_ID
  • ROLE_ID

<强> User_Right

  • USER_ID
  • right_id

<强>角色

  • ID
  • 名称

<强> Role_Right

  • ROLE_ID
  • right_id

从右

  • ID
  • 名称

如果Right足以将用户权限分开,则可能需要使用Role删除所有内容。

答案 1 :(得分:1)

  1. 在表imagesusers中,您将引用客户ID,而不是名称。
  2. 我会为画廊创建一个单独的表格,因为客户往往每三个月都会有新的愿望。所以你可能需要添加更多的画廊。
    • 表“画廊”
      • ID
      • 名称
    • 表格“image_is_in_gallery”
      • image_id
      • gallery_id
      • PRIMARY(image_id,gallery_id)

答案 2 :(得分:1)

您可能需要考虑规范化。

假设用户名是唯一的 - 两个人不能拥有相同的用户名,那么你可以消除Users表中的“id”以帮助防止更新/插入/删除异常(这样做几乎可以肯定)将用户放入BCNF,可能是DKNF - 这是一件好事。)

客户很好。但是,客户和用户之间有什么区别?真的......看起来和我差不多。

确保使用外键约束完成引用,我认为应该更好。

编辑:

基于新设计,我有以下建议:

将客户/用户更改为三个表:

  ClientNames
  - ClientID (PK)
  - ClientName

  ClientUsernames
  - ClientID (PK)
  - Username

  UsernamePasswords
  - Username (PK)
  - Password

这是安全的,并说一个客户/用户有一个名字,一个客户/用户有一个用户名,一个用户名有一个密码。我没有看到另一个好的分解(从某种意义上来说它将处于一种正常的形式)。

如果需要,可以通过消除合成“ClientID”键来消除其中一个表。这有一些缺点,可能无法实现(有些人的名字相同!)。

这里的问题是ClientID,ClientName和UserName很可能以不适合将它们填充到同一个表中的方式相互确定。

答案 3 :(得分:0)

  1. 在图像和用户表上使用客户端ID而不是client_name
  2. 添加另一个表格,至少包含名称和ID列
  3. 添加另一个表,portfolio_images包含两列,image_id和portfolio_id。这将允许@Alex在评论中提到的功能
  4. 回复编辑
    您可以通过查询PORTFOLIO_IMAGES并根据需要加入图像或投资组合,在多个投资组合中创建一个图像。例如,如果要显示婚礼组合(伪代码)

    SELECT filename,... 
    FROM images img
    INNER JOIN portfolio_images pimg on img.image_id = portfolio_images.image_id
    WHERE pimg.portfolio_id = <whatever the id is for wedding portfolio>