我有一张桌子,用于存储用户上传的文件。可以有5种不同的文件类型:个人资料图片,cpr文件,学位文件,视频文件,背景检查文件。
表结构是这样的:
file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created
我的问题:
file_cat = "profile_picture" and user_id=:user_id
行。这会给系统带来很大的负担吗?insert into ... VALUES ... on duplicate key update
吗?提前谢谢。
答案 0 :(得分:5)
这是三个问题,而不是一个。
这种结构有效还是我应该创建5个不同的表?
一张桌子足够好
如果我想更新,请说出用户个人资料图片行 什么是最好的方法呢? ---我想出了一个解决方案 这可能不是最好的 - 我更新了file_cat的行 =" profile_picture"和user_id =:user_id。这会给系统带来很大的负担吗?
如果您在file_cat,user_id(两个字段上都是复合索引)上有索引,则不会。如果你想让事情变得更精简,你可以存储常数而不是' profile_picture'等等,例如
profile_picture = 1
cpr = 2
....
background = 6
这会使表和索引变小。 可能使查询稍快一些。
首先,当用户注册时,他没有任何文件。我应该用户 插入... VALUES ...在带有隐藏值的重复键更新时 在一种形式?
没必要。没有新用户的记录实际上使事情变得更容易。您可以执行COUNT(*) = 0
查询或更好的EXISTS
查询,而无需获取行并进行检查。
更新: 当您处理JOIN或子查询时,这些EXISTS查询非常有用,例如快速查找用户是否已上传个人资料picc
SELECT * from users WHERE exists (SELECT * from pictures where pictures.user_id = users.id)
答案 1 :(得分:1)
如果您正确使用主键,则insert ... on duplicate key update ...
查询将为您完成所有操作。
对于您的表,您需要定义主键列。在这种情况下,我会说这是您的file_id
列。因此,如果您执行插入操作,MySQL服务器将检查您的file_id
列是否已为该值定义,如果是,它将使用新值更新,否则它将添加新的数据行新的file_id
。
我应该很容易分开它,创建一个用于创建新行的脚本和另一个用于更新的脚本。通常,您将知道何时创建而不是在应用程序中进行更新。再次正确使用主键将帮助您解决很多问题。在where
子句中使用主键我非常确定是最有效的更新方法之一。
https://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html