2016-07-20 47 views
2

我有一张表,我在那里存储用户上传的文件。可以有5种不同的文件类型:配置文件图片,cpr文件,学位文件,视频文件,背景检查文件。如何更新MYSQL中的特定行

表结构是这样的:

file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created 

我的问题:

  1. 是这种结构有效,或者我应该创建5个不同的表?
  2. 如果我想更新,让我们说用户个人资料图片行,那么最好的办法是什么? ---我想出了一个解决方案,可能不是最好的 - 我更新了行,其中file_cat = "profile_picture" and user_id=:user_id。这会给系统带来很多负担吗?
  3. 首先当用户注册时,他没有任何文件。我应该在表单中隐藏一个用户insert into ... VALUES ... on duplicate key update吗?

在此先感谢您。

+0

不要将文件存储在数据库中,将它们存储在磁盘上。请参考数据库中文件的位置。 –

+0

关于结构 - 这只是我的意见,但个人资料图片会经常访问,所以它可能是一个好主意,让他们有自己的表。对于它们的查询返回的速度要比其余时间的查询快得多。 – PockeTiger

+0

@KIKOSoftware是的。文件存储在磁盘上,路径在DB – raqulka

回答

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查询,而无需获取行并检查它们。

更新: 这些EXISTS查询是真正有用的,当你正在处理的加入或例如子查询快速找到,如果用户已经上传了个人资料PICC

SELECT * from users WHERE exists (SELECT * from pictures where pictures.user_id = users.id) 
+0

谢谢你的解释先生。 – raqulka

+0

你可以给我一个快速的例子,如果存在查询? – raqulka

+0

我使用了行数。看起来更多的工作,但它的工作。性能方面,行数和存在是否有区别? – raqulka

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

+1

谢谢你的解释。非常感谢 – raqulka