繁体   English   中英

如何设计我的MySQL数据库? 一两张桌子?

[英]How to design my MySQL database? One or two tables?

我需要你的建议。

我的网站上有一些用户可以上传10张图片。 我想给用户机会1.订购图片2.给图片加上标题。

数据库设计应该如何?

我已经有一个表'image_order',其中列user_id第一...第十

那里的值是NULL或图像名称。 因此,顺序正常。

但是现在我有第二个机会希望用户给我:标题。

我可以轻松创建带有表user_id image_name image_title的新表“ image_titles”

其中user_id + image_name是主键。

但是我不知道这是否是一个好的设计。 我还可以删除表“ image_order”并将列添加到表“ image_titles”中,该表可以命名为“ order_position”。 这样一来,只有一个表“ image_titles”或更好的“ image_properties”以及以下几列:user_id image_name image_title order_position

其中user_id + image_name是主键。

你有什么建议? 一两张桌子? 还是您有其他想法?

[关于性能。 可能会有很多用户和很多图片...]

否。为每个字段创建一个单独的表不是一个好主意。 表可以容纳多个字段,可以利用这一点。 当前,您正在横向设计表,使用列作为行,使用表作为列。 考虑这样的事情:

Users
----------
ID
Username
etc.

UserImages
----------
ID
UserID
Title
SortOrder
etc.

您的对象模型有两个实体,一个User和一个UserImage。 用户包含多个UserImage。 因此,只需创建表以反映该模型即可。 在上表中,存在多对一关系,因此任何给定的User可以具有多个UserImages ,任何给定的UserImage可以具有一个User

将用户限制为10张图像的逻辑将属于应用程序,而不属于数据库。 可以将此逻辑作为存储过程中的应用程序逻辑代码放入数据库中。 然后,也许撤销对表的INSERT权限,并要求任何人插入图像以使用包含该逻辑的存储过程。 (我对数据库的权限模型进行了一些假设,希望这是可能的。)

无论哪种方式,都不应破坏存储模式以简化该逻辑。 模式应该只存储数据,使用代码来实现逻辑。

正确的数据库设计原则通常不会对固定大小的阵列连续显示微笑。 使用链接表通常会更好,例如:

users:
    id, primary key
    any_other_details
pictures:
    id, primary key
    user_id, foreign key, references users(id)
    title
    picture
    any_other_details

这样一来,每个用户可以拥有任意数量的图片,并且如果需要两者的信息,只需将表格与select连接即可。

不必担心这些联接的性能,这就是数据库擅长的方面,只要设置得当,您就可以向它们抛出数百万行的表,而不会出现问题。

您很可能只需要一个表:

Table image
    user_id
    image_name // I assume this is some kind of link to the actual image file
    title
    ordering // an int in the range 1 to 10

pk: user_id + ordering

您的十列image_order表非常不灵活(如果每个用户的图像数更改,则必须更改),并且还会进行复杂的查询,例如以正确的顺序为用户加载所有图像所需的查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM