Database design 除了连接20个表,还有其他写/读数据的选项吗?

Database design 除了连接20个表,还有其他写/读数据的选项吗?,database-design,social-networking,Database Design,Social Networking,我正在创建一个用户配置文件。所有字段都是根据自己的表格进行查找的,如喜爱的电影、喜爱的音乐、喜爱的食物、运动等。。。这些不是文本字段,而是系统维护列表中的自动建议字段。它们都在自己的表格中的原因是它们有更多独特的颜色 因此,在用户输入时读取数据是可以的,但之后会出现两个问题: 1) 写入数据:由于这是一个M:M关系,我需要20个不同的表? 2) 在概要文件加载时读取数据:我需要加入所有这20个表来获取用户的数据 我还需要什么选项来存储所有这些用户详细信息?我唯一关心的是性能,因为这是一个社交网站

我正在创建一个用户配置文件。所有字段都是根据自己的表格进行查找的,如喜爱的电影、喜爱的音乐、喜爱的食物、运动等。。。这些不是文本字段,而是系统维护列表中的自动建议字段。它们都在自己的表格中的原因是它们有更多独特的颜色

因此,在用户输入时读取数据是可以的,但之后会出现两个问题:
1) 写入数据:由于这是一个M:M关系,我需要20个不同的表?
2) 在概要文件加载时读取数据:我需要加入所有这20个表来获取用户的数据

我还需要什么选项来存储所有这些用户详细信息?我唯一关心的是性能,因为这是一个社交网站。20分钟不好。但我不确定其他技术。我正在使用mysql和php

我唯一能想到的另一个选择是将数据存储在数据库中的数组中,尽管我不知道搜索的效果如何

20分钟不好

谁说的?我不会担心查询中的连接数,除非您看到它实际上成为一个问题。关系数据库的设计是为了解决表之间的关联问题


现在,至于你是否真的需要20个连接,完全是另一个问题。您应该发布一个示例查询和数据库设计的一些相关部分,我们可以告诉您是否有任何问题。

您可以将用户配置文件存储在非关系数据存储中,如


这不仅可以避免混乱的连接,而且可以更轻松地动态更改用户配置文件架构,并避免编写大量数据访问代码。

根据您的性能要求,20个连接可能是问题,也可能不是问题。但如果你想在负载下得到亚秒级的响应,那么最好避免这种情况。但是如果这只发生在用户登录时,并且您希望每秒登录次数不超过几次,并且您没有其他繁重的数据库负载,等等,那么性能可能是可以忍受的

如果你不能把其中的一些结合起来,我会很惊讶。我认为许多概要文件属性都可以用一个公共结构表示,如 PersonId,TraitType,string1,string2,int1,int2,date1,date2

如果在代码中,您正在执行类似于数据的OO表示的操作,那么您可以将TraitType映射到完全表示该类型的类,这样您的程序就不需要在该表设计所表示的抽象级别上工作

  • 埃尔罗伊

    • 是否需要在配置文件加载时加载所有数据?在我看来,您的引用表名称代表了概要文件本身的某种启示,当用户激活时,它会执行该表中项目的查询,不是吗

      我不是专业的网络程序员,所以我可能完全错了。但它似乎加载了概要文件,并向用户提供了一个摘要/导航界面,对吗?通过一些按钮/图示符,用户可以通过哪些按钮/图示符导航和/或请求更多信息

      在配置文件加载时,会出现顶级配置文件信息,以及(过于简化的)一些按钮,可能位于标题小部件“我的收藏夹”下。“地点”、“食物/饮料”、“音乐”等按钮可能存在。当用户激活其中一个按钮时,将对该特定表(以及任何相关联接)执行查询,以返回特定于“地点”的数据


      也许它与Web不同(我很快就会了解),但我会在有意义的时候尝试请求数据,并且在用户可能期望短暂访问时间的时候尝试请求数据。按钮点击通常是一个点,在这个点上,用户将期望响应稍微滞后

      减少联接数量的一种方法是将所有20种类型共有的数据存储在一个表中。此表与20个专用表的关系遵循gen spec设计模式。查阅“泛化-专业化-关系建模”,了解如何在表中实现gen-spec模式

      如果这样做,您将只在需要时引用专用表

      我不确定你的使用模式,所以我不能说这个建议是否适用于你的情况。但这是值得研究的

    • 安装您喜爱的dbms
    • 创建一个用户表,并创建两个或多个用户表 三个用户收藏夹表
    • 写一个小程序来生成 并加载一百万个随机用户
    • 写一个小程序来生成 加载1000万部最喜欢的电影 (或随便什么)为了那一百万 用户
    • 运行一些查询
    • 如果速度是一个问题,那么在模式后贴上“数据库设计”和“查询优化”标签,并包含指向此问题的链接


      稍后 无聊的所以我自己做了测试。我没有时间做20次联接,但是在一个有100万用户的表上,在每个联接的表中有5000多万行,剩下的5次联接将在大约400毫秒内返回。(PostgreSQL 9.0.2)现在返回工作


      之后 还是很无聊。我添加了更多的表、更多的数据和更多的左外部联接。根据特定电子邮件地址的数据,更多的加入可能会更快。(你会猜到吗?)上一次测试我从“用户”中随机选择了几十个电子邮件地址

      如果我以后还觉得无聊,我会编一个程序

      • 根据需要执行几百个查询 在随机电子邮件地址上,以及
      • 记录执行时间(尽管我不确定是否可能)

      那么,必须先有人了解这个数据库。我的开发团队从来没有冒险离开过MySQL,所以如果他们使用它,那么他们将花一个月的时间来学习它,这意味着一个月的启动时间就被浪费了。我看到很多人在推荐NoSQL数据库,比如MongoDB或CouchDB
                 run time (milliseconds)
      --
      median      40 
      maximum    222
      minimum      0.4 ("Four tenths of a millisecond", not a typo.)