Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Mysql 如何存储每个用户的可变语言数?_Mysql_Sql - Fatal编程技术网

Mysql 如何存储每个用户的可变语言数?

Mysql 如何存储每个用户的可变语言数?,mysql,sql,Mysql,Sql,我有一个标准的用户表。现在,每个用户都可以在其个人资料中添加未知数量的语言。为每个用户存储语言的最佳方式是什么?我只想查询一次,以获取用户及其所有对应的语言。什么是最好的设计 例如: User ==== id name ---------- 99 peter Languages ========= id userid lang -------------------- 44 99 en 45 99 fr 这是一种

我有一个标准的用户表。现在,每个用户都可以在其个人资料中添加未知数量的语言。为每个用户存储语言的最佳方式是什么?我只想查询一次,以获取用户及其所有对应的语言。什么是最好的设计

例如:

User
====

id    name    
----------
99    peter


Languages
=========

id    userid    lang
-------------------- 
44    99        en
45    99        fr

这是一种多对多关系(一个用户可以有多种语言,反之亦然),因此要规范化数据库,您应该创建一个包含两个外键的新表(称为user_x_languages):

您需要从语言表中删除userid列

然后,查询应该使用联接

select name lang from user u
join user_x_languages x on u.id = x.user_id
join languages l on x.lang_id = l.id
where u.id = 99;
这将为用户拥有的每种语言输出一行,但将在每行重复用户名

要了解DB规范化,一篇非常好的非技术性文章如下:

按照thread关于返回一行的建议,该过程类似于(我可能已经将表名和列名从原来的名称更改了一点):

现在,选择应该是(对于所有用户):


这是一种多对多关系(一个用户可以有多种语言,反之亦然),因此要规范化数据库,您应该创建一个包含两个外键的新表(称为user_x_languages):

您需要从语言表中删除userid列

然后,查询应该使用联接

select name lang from user u
join user_x_languages x on u.id = x.user_id
join languages l on x.lang_id = l.id
where u.id = 99;
这将为用户拥有的每种语言输出一行,但将在每行重复用户名

要了解DB规范化,一篇非常好的非技术性文章如下:

按照thread关于返回一行的建议,该过程类似于(我可能已经将表名和列名从原来的名称更改了一点):

现在,选择应该是(对于所有用户):


这是一种多对多关系(一个用户可以有多种语言,反之亦然),因此要规范化数据库,您应该创建一个包含两个外键的新表(称为user_x_languages):

您需要从语言表中删除userid列

然后,查询应该使用联接

select name lang from user u
join user_x_languages x on u.id = x.user_id
join languages l on x.lang_id = l.id
where u.id = 99;
这将为用户拥有的每种语言输出一行,但将在每行重复用户名

要了解DB规范化,一篇非常好的非技术性文章如下:

按照thread关于返回一行的建议,该过程类似于(我可能已经将表名和列名从原来的名称更改了一点):

现在,选择应该是(对于所有用户):


这是一种多对多关系(一个用户可以有多种语言,反之亦然),因此要规范化数据库,您应该创建一个包含两个外键的新表(称为user_x_languages):

您需要从语言表中删除userid列

然后,查询应该使用联接

select name lang from user u
join user_x_languages x on u.id = x.user_id
join languages l on x.lang_id = l.id
where u.id = 99;
这将为用户拥有的每种语言输出一行,但将在每行重复用户名

要了解DB规范化,一篇非常好的非技术性文章如下:

按照thread关于返回一行的建议,该过程类似于(我可能已经将表名和列名从原来的名称更改了一点):

现在,选择应该是(对于所有用户):


您可以创建多对多关系表。像这样:

表“用户”

表“语言”

表“用户到语言”

或者,如果将来需要很多用户属性,可以使用以下内容: 表用户属性

user_id | attribute | value
46        'lang'      'en'

此外,这可能对您有用:

您可以创建多对多关系表。像这样:

表“用户”

表“语言”

表“用户到语言”

或者,如果将来需要很多用户属性,可以使用以下内容: 表用户属性

user_id | attribute | value
46        'lang'      'en'

此外,这可能对您有用:

您可以创建多对多关系表。像这样:

表“用户”

表“语言”

表“用户到语言”

或者,如果将来需要很多用户属性,可以使用以下内容: 表用户属性

user_id | attribute | value
46        'lang'      'en'

此外,这可能对您有用:

您可以创建多对多关系表。像这样:

表“用户”

表“语言”

表“用户到语言”

或者,如果将来需要很多用户属性,可以使用以下内容: 表用户属性

user_id | attribute | value
46        'lang'      'en'

此外,这可能对您有用:

规范化用于节省磁盘空间,即良好的规范化数据库占用的空间比非规范化数据库少,但您付出的代价是性能。请记住,更多的规范化=更多的连接=更多的处理开销。在我看来,您的设计(使用两个表)很好,您可以通过单个联接轻松检索数据:

select * from Usrs u join Languages l on u.id = l.usrid

now some sample queries which will come in application code 
--select those users who speak 'en' then 

select * from Usrs u join Languages l on u.id = l.usrid
where l.lang = 'en'

--peter speaks which languages 
select * from Usrs u join Languages l on u.id = l.usrid
where u.name = 'peter'

使用规范化数据库也可以这样做,您会发现您需要所有三个表来获得所需的数据。

规范化用于节省磁盘空间,也就是说,一个好的规范化数据库占用的空间比非规范化数据库少,但您付出的代价是性能。请记住,更多的规范化=更多的连接=更多的处理开销。在我看来,您的设计(使用两个表)很好,您可以通过单个联接轻松检索数据:

select * from Usrs u join Languages l on u.id = l.usrid

now some sample queries which will come in application code 
--select those users who speak 'en' then 

select * from Usrs u join Languages l on u.id = l.usrid
where l.lang = 'en'

--peter speaks which languages 
select * from Usrs u join Languages l on u.id = l.usrid
where u.name = 'peter'

使用规范化数据库也可以这样做,您会发现您需要所有三个表来获得所需的数据。

规范化用于节省磁盘空间,也就是说,一个好的规范化数据库占用的空间比非规范化数据库少,但您付出的代价是性能。请记住,更多的规范化=更多的连接=更多的处理开销。在我看来,您的设计(使用两个表)很好,您可以通过单个联接轻松检索数据:

select * from Usrs u join Languages l on u.id = l.usrid

now some sample queries which will come in application code 
--select those users who speak 'en' then 

select * from Usrs u join Languages l on u.id = l.usrid
where l.lang = 'en'

--peter speaks which languages 
select * from Usrs u join Languages l on u.id = l.usrid
where u.name = 'peter'

对规范化数据库进行同样的尝试,您会发现您需要所有三个表来获得所需的数据。

规范化用于保存磁盘