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'
对规范化数据库进行同样的尝试,您会发现您需要所有三个表来获得所需的数据。规范化用于保存磁盘