Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个表包含多个字段还是两个表包含较少的字段?_Php_Mysql_Sql_Database_Optimization - Fatal编程技术网

Php 一个表包含多个字段还是两个表包含较少的字段?

Php 一个表包含多个字段还是两个表包含较少的字段?,php,mysql,sql,database,optimization,Php,Mysql,Sql,Database,Optimization,我的问题很简单,目前,我有一个数据库,其中有一个“用户”表,其中包含每个用户的重要信息(电子邮件、用户名、密码),一个“身份”表,其中包含名字、姓氏、生日。。。和“Medias”表,该表当前包含“facebook”、“googlePlus”、“twitter”、“youtube”等字段。。。用户所有媒体的实际地址 但是,我的问题是:如果我将我的表“media”减少为两个字段:“address”、“type”(和“user_id)”,并且类型可以是“twitter”、“facebook”,那么数据

我的问题很简单,目前,我有一个数据库,其中有一个“用户”表,其中包含每个用户的重要信息(电子邮件、用户名、密码),一个“身份”表,其中包含名字、姓氏、生日。。。和“Medias”表,该表当前包含“facebook”、“googlePlus”、“twitter”、“youtube”等字段。。。用户所有媒体的实际地址

但是,我的问题是:如果我将我的表“media”减少为两个字段:“address”、“type”(和“user_id)”,并且类型可以是“twitter”、“facebook”,那么数据库的设计可能会更好


如果我有数百个用户,最佳的方法是什么?在速度和RAM使用方面?

你可以选择任何一种方式,这只是偏好的问题。就性能而言,它可能可以忽略不计,但我认为一张桌子上的所有东西都是最有效的。您可能希望创建一个包含以下列的媒体表:

用户ID、MediaName、MediaValue

1,谷歌,,whoever@google.com

1、youtube、youtube/mychannel


这可能是一种更具扩展性的方式,您只需为用户添加媒体(如果有的话)。

您可以选择任何一种方式,这只是偏好的问题。就性能而言,它可能可以忽略不计,但我认为一张桌子上的所有东西都是最有效的。您可能希望创建一个包含以下列的媒体表:

用户ID、MediaName、MediaValue

1,谷歌,,whoever@google.com

1、youtube、youtube/mychannel


如果您只为用户添加媒体(如果有的话),那么这可能更具可扩展性。

我建议使用多个包含3-9列的表。一切取决于你想要什么。 多多少少都是无效的,因为进入表格并像人一样阅读是很耗时的。 桌子越重,装载时间越长。 根据要保存的内容,找到要使用的最佳有效列数,就像为每个类别创建一个表比将所有内容保存在一个表中要好。 速度和友好。 RAM和处理能力取决于您的流量和php计算(如果很复杂的话),只有当您处理成千上万的用户时,它们才有意义。
最好的

我建议有很多3-9列的表。一切取决于你想要什么。 多多少少都是无效的,因为进入表格并像人一样阅读是很耗时的。 桌子越重,装载时间越长。 根据要保存的内容,找到要使用的最佳有效列数,就像为每个类别创建一个表比将所有内容保存在一个表中要好。 速度和友好。 RAM和处理能力取决于您的流量和php计算(如果很复杂的话),只有当您处理成千上万的用户时,它们才有意义。
最好的

经典的狭隘与广泛的辩论。让我们看看你目前的设计。您有一个包含用户id的宽表和其他四列社交媒体链接。也许是这样的:

数据 如果varchar列可为空,则您的存储处于最佳状态。如果您的用户没有twitter帐户,但有google帐户,则只有google_plus列将包含数据。其他字段为null,并且
varchar
null字段不占用任何存储空间

现在让我们来看看狭窄的设计

medias
  user_id
  media_type
  link
这有三列,但它们总是被填充的。你计划用“推特”、“谷歌”等填充媒体类型,这意味着你使用的存储空间比宽幅设计要多。如果用户有两个社交媒体帐户,则会存储两次用户id。您可以通过使用常量稍微减少这一点

twitter=1
google_plus=2
yahoo=3
将这些数字存储在“媒体类型”列中。然后该字段可以是
smallint
,它占用很少的空间。如果您需要大量的媒体帐户,您不能使用这样的常量,但需要为它们创建一个单独的表,并在此表中只输入您的ID

索引 有广泛的设计,想知道有多少用户有谷歌帐户或twitter帐户?现在你需要在twitter和google_plus专栏上建立一个索引,这些索引将非常大。与索引的大小相比,通过存储空值保存的内容将非常小。(可以通过只索引部分列来克服)

尝试这样做:找出有多少用户至少拥有三个社交媒体帐户。这是一个很难回答的问题,桌子很宽,不是吗?但是一个非常简单的,有一张窄桌子的

另一方面,窄表猜测只有媒体类型的列需要被索引,这是一个非常小的索引。如果您进行这种查询,您肯定需要一个窄表

其他考虑 假设雅虎倒闭了,你会想在你的宽表中删除该列,对吗?有没有试过在一个有一百万行的表上删除一列?你输入altertable命令,出去吃午饭,当你回来时,你会发现它仍然在运行,你的网站没有响应

假设另一家社交媒体公司成立并接管了facebook。尝试添加一列。与上述结果相同


最后,对于几百行来说,这一切都不重要,但实践使用正确的设计始终是一个好主意。

经典的窄行与宽行之争。让我们看看你目前的设计。您有一个包含用户id的宽表和其他四列社交媒体链接。也许是这样的:

数据 如果varchar列可为空,则您的存储处于最佳状态。如果您的用户没有twitter帐户,但有google帐户,则只有google_plus列将包含数据。其他字段为null,并且
varchar
null字段不占用任何存储空间

现在让我们看一看。
twitter=1
google_plus=2
yahoo=3