一个表包含多个字段或两个表包含较少的字段?

润滑脂

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

但是,我的问题是:如果我将表“ Medias”缩小为2个字段:“ address”,“ type”(和“ user_id”),并且类型可以为“ twitter”,“ facebook”,也许数据库会得到更好的设计“ ...

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

e4c5

经典的狭义之争。让我们来看看您当前的设计。您有一个带有user_id的宽表,以及用于社交媒体链接的其他四列。也许是这样的:

数据

medias
  user_id int
  twitter varchar
  google_plus varchar

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

现在让我们看一下狭窄的设计

medias
  user_id
  media_type
  link

它具有三列,但始终会被填充。您打算用'twitter','google'等填充media_type。因此,这意味着您要使用的存储空间要比广泛的设计要多。如果用户有两个社交媒体帐户,则user_id将存储两次。您可以通过使用常量来减少这一点。

twitter=1
google_plus=2
yahoo=3

将这些数字存储在media_type列中。这样该字段可以smallint占用很少的空间。如果您期望使用大量的媒体帐户,则不能使用这样的常数,但是需要为它们创建一个单独的表,并在此常数中仅输入您的ID。

索引

具有广泛的设计,并希望了解有多少用户拥有一个Google帐户或一个Twitter帐户?现在,您需要在twitter和google_plus列上都建立一个索引,这些索引将变得非常大。与索引的大小相比,通过存储空值保存的内容将非常小。(可以通过仅索引部分列来克服)

尝试这样的事情:找出有多少用户至少拥有三个社交媒体帐户。这是一个很难处理的宽表查询,不是吗?但是桌子狭窄却很容易。

另一方面,狭窄的表猜测只有media_type列需要索引的内容,而这是一个很小的索引。如果执行这种查询,则肯定要使用狭窄的表。

其他注意事项

假设Yahoo倒闭了,您想在宽表中删除该列,对吗?曾经尝试过在具有100万行的表格上放置一列吗?您键入alter table命令,出去吃午餐,当您回来时,您会发现它仍在运行,并且您的网站没有响应。

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

最后,对于几百行来说,所有这些都不是真正重要的事情,但是,开始实践使用正确设计的做法总是一个好主意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建一个包含来自两个不同数据表的两个字段的数组

来自分类Dev

当必须将包含两个点的形式的文本字段中的数据插入表中时,将截断一个字符

来自分类Dev

高级SQL查询设计帮助(在两个表中重复,多个字段,可能基于一个字段的排除项)

来自分类Dev

一个表中的两个字段与另一个表中的一个字段相关

来自分类Dev

如何将一个表中的两个字段关联到另一个表中的一个字段

来自分类Dev

将两个两字段表合并为一个多字段,其中第一个字段为键

来自分类Dev

循环一个大表的两个字段

来自分类Dev

SQL语句-难以从一个表中产生两个字段

来自分类Dev

具有一个表和两个字段的内部联接

来自分类Dev

循环一个大表的两个字段

来自分类Dev

如何从名称列表中获得两个字段数的总和:一个包含2个字段,另一个包含3个或更多字段?

来自分类Dev

WordPress:get_user_meta-在一个字段中包含两个变量

来自分类Dev

从另一个表中选择多个列,其中字段包含数组

来自分类Dev

如何从两个不同的表中获取两个字段的计数,并将MySQL中另一个表中的字段分组

来自分类Dev

将两个表连接在一起并在一个表中包含多个结果

来自分类Dev

根据外来表更新并选择一个字段,该表包含基于最新寄存器的几行

来自分类Dev

SQL:如何根据另一个表中的相同字段创建两个字段?

来自分类Dev

从一个表中总结两个或更多特定值,表中包含多个值

来自分类Dev

将两个表简单地组合成一个包含两个表的列的表

来自分类Dev

SQL-将同一表中的两个字段连接到另一个表中的单个字段

来自分类Dev

MySQL连接两个表,另一个字段具有最大值

来自分类Dev

一个php / MySQL表单的两个表有一个公共字段?

来自分类Dev

如何通过选择另一个字段值将一个表与两个表联接

来自分类Dev

从两个表中选择结果,但在另一个表上选择一个字段

来自分类Dev

RethinkDB:如果一个表不包含另一个表的键,则合并两个表

来自分类Dev

mysql中基于两个表的JOIN更新多个字段

来自分类Dev

Django-对两个字段进行OR过滤,其中一个在相关表中

来自分类Dev

如何从存储库中获取一个值,该值与表的两个字段进行比较

来自分类Dev

如何使用不同的条件(SQL)更新同一个表中的两个字段?

Related 相关文章

  1. 1

    创建一个包含来自两个不同数据表的两个字段的数组

  2. 2

    当必须将包含两个点的形式的文本字段中的数据插入表中时,将截断一个字符

  3. 3

    高级SQL查询设计帮助(在两个表中重复,多个字段,可能基于一个字段的排除项)

  4. 4

    一个表中的两个字段与另一个表中的一个字段相关

  5. 5

    如何将一个表中的两个字段关联到另一个表中的一个字段

  6. 6

    将两个两字段表合并为一个多字段,其中第一个字段为键

  7. 7

    循环一个大表的两个字段

  8. 8

    SQL语句-难以从一个表中产生两个字段

  9. 9

    具有一个表和两个字段的内部联接

  10. 10

    循环一个大表的两个字段

  11. 11

    如何从名称列表中获得两个字段数的总和:一个包含2个字段,另一个包含3个或更多字段?

  12. 12

    WordPress:get_user_meta-在一个字段中包含两个变量

  13. 13

    从另一个表中选择多个列,其中字段包含数组

  14. 14

    如何从两个不同的表中获取两个字段的计数,并将MySQL中另一个表中的字段分组

  15. 15

    将两个表连接在一起并在一个表中包含多个结果

  16. 16

    根据外来表更新并选择一个字段,该表包含基于最新寄存器的几行

  17. 17

    SQL:如何根据另一个表中的相同字段创建两个字段?

  18. 18

    从一个表中总结两个或更多特定值,表中包含多个值

  19. 19

    将两个表简单地组合成一个包含两个表的列的表

  20. 20

    SQL-将同一表中的两个字段连接到另一个表中的单个字段

  21. 21

    MySQL连接两个表,另一个字段具有最大值

  22. 22

    一个php / MySQL表单的两个表有一个公共字段?

  23. 23

    如何通过选择另一个字段值将一个表与两个表联接

  24. 24

    从两个表中选择结果,但在另一个表上选择一个字段

  25. 25

    RethinkDB:如果一个表不包含另一个表的键,则合并两个表

  26. 26

    mysql中基于两个表的JOIN更新多个字段

  27. 27

    Django-对两个字段进行OR过滤,其中一个在相关表中

  28. 28

    如何从存储库中获取一个值,该值与表的两个字段进行比较

  29. 29

    如何使用不同的条件(SQL)更新同一个表中的两个字段?

热门标签

归档