[英]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.