Mysql 什么时候最好创建元表?

Mysql 什么时候最好创建元表?,mysql,database,laravel,lumen,Mysql,Database,Laravel,Lumen,最近,我发现自己正在为大多数主表创建元表 例如,我的用户表包含密码、电子邮件和ID,以及一些时间戳。但是像用户来自哪里,他们的个人资料图片,或者他们最喜欢的颜色,我都存储在用户元表中。一些细节,比如联系人,我在元表中存储为JSON值(数组),键为contacts,值为带有联系人细节的JSON数组 我的理由是,它使我更容易更改前端并添加功能/细节,而无需处理服务器端的事情 也就是说,我担心必须经常获取元表,这会影响性能。在上面概述的例子中,每次显示用户列表时,我都必须获取元表,以便获得他们的个人资

最近,我发现自己正在为大多数主表创建元表

例如,我的用户表包含密码、电子邮件和ID,以及一些时间戳。但是像用户来自哪里,他们的个人资料图片,或者他们最喜欢的颜色,我都存储在用户元表中。一些细节,比如联系人,我在元表中存储为JSON值(数组),键为
contacts
,值为带有联系人细节的JSON数组

我的理由是,它使我更容易更改前端并添加功能/细节,而无需处理服务器端的事情

也就是说,我担心必须经常获取元表,这会影响性能。在上面概述的例子中,每次显示用户列表时,我都必须获取元表,以便获得他们的个人资料图片


什么时候创建一个单独的键值元表而不是仅仅使用特定的列更好?

您所做的并不一定是错误的,但是,用关系术语来说,“元”表并不是描述您希望实现的目标的正确方式

没有什么能说明你不能拥有一个与用户有1:1关系的用户配置文件和其他具有不同类型关系的表——例如一对多

在JSON方面:您的用户联系人数据在结构上通常不会改变,因此您可以创建一个user_contacts表,假设每个用户有一个或多个联系人,该表的值为1:n。我个人也不喜欢用“meta”作为表的后缀来表示一些自引用,因为它太模糊,无法描述可能的内容(特别是如果您还有一个或多个包含JSON数据类型的列)。我会选择JSON数据类型,以防结构经常发生变化,从而保证它是有用的

<>如果您的用户数据的结构经常处于流动状态,您可能需要考虑一个NoSQL数据库,或者您可能有一个“元”表,正如您所描述的那样,JSON数据类型的两个类型,其中数据的结构是可变的,并且不需要将数据解压缩到足以使它成为一个痛苦…… 在这个问题上再做一点扩展。没有硬性的规则,但通常情况下,如果您的表要存储很多行,您可以保持它的紧凑性,并且只包含最常访问的数据。使用1:1 user_profile表的一个原因是,当用户登录时,您只能访问该表一次,并且您可能希望缓存该数据,并且只有在用户更新该数据时才能再次检索该数据。很多情况下,这将取决于应用程序本身的使用情况和体系结构(即,每个应用程序都是不同的)

尽管如此,如果您没有数量庞大的列,那么使用一个表来包含给定模型的所有关联数据是非常好的

根据您的请求,在下面进行了一些扩展:我对SQL上下文中的meta的评论。例如,元数据通常描述表及其列(即排序规则、字符集、列类型、长度和其他属性等)。从理论上讲,您没有错误地命名表,但可能会有点混淆

什么时候创建一个单独的键值元表而不是只使用特定的列更好

当应用程序需要执行某些操作的数据类型可能随时间而变化,或者当您有大量与模型/表没有强相关性的可空字段时,元表是最好的

WordPress有一个用于用户和帖子的元表。这是因为WordPress被创建为高度可定制的主题,开发人员不知道每个主题需要什么才能正常工作

另一个用例可能是,如果您正在创建一个全方位的消息传递应用程序,比如MessageBird,您可以通过WhatsApp、Telegrame和SMS等多种渠道来推送消息。每个通道可能对发送消息所需的数据有不同的要求,未来可能会出现新的通道,它们有自己的数据要求。因此,使用元表来满足未来的需求是有意义的


就影响性能而言,这实际上取决于应用程序需要做什么。对于某些用例,性能影响可以忽略不计(例如,如果正在执行的操作仅在服务器上发生,并且不需要向前端发送数据)。但即使不是这样,您也可以使用NoSQL服务(如Redis)缓存数据,这样就不必在每次请求时从数据库中获取数据。

我会将配置文件pic、收藏夹颜色、位置等作为列存储在
用户表中。我不会以这种方式存储联系人-他们应该是一个单独的表,并且有适当的关系。非常彻底的回答!实际上,我担心User_profile表中的行太多会影响性能。我现在明白了如何将联系人存储在单独的表中。我认为你是对的,这是NoSQL的一个很好的用例,但出于某种原因,我很难理解这一点。顺便说一句,你能详细说明一下“meta”一词何时用于db吗?@MichałFacebook在MySQL中存储了数十亿行。只要你有适当的索引,拥有大量的行应该不是问题。@ceejayoz这让我想到,他们在我们身上创建一个新的数据字段来显示在用户配置文件的前端是多么容易。如果他们想在“宗教信仰”旁边显示“最喜爱的浮动特斯拉”,那么这是否只是一个简单的例子,只需在预先存在的键值表中添加一个新的
最喜爱的特斯拉
键和一个
红色的值
,或者它会要求他们添加列和构建新表吗?他们有很多有趣的信息。做