当前位置: 首页 > 知识库问答 >
问题:

移动应用程序的正确结构(数据库)

柴寂离
2023-03-14

问题是,从性能上看,这些选项中的哪一个(显然,可能还有第三个我们没有考虑)是最好的。我认为第二种选择我看到了几个缺陷,但我不确定。就延迟和速度而言,遍历数组(如果添加了服务,或者由于用户首先使用了service2,然后使用了Service1),遍历数组的次数会更多)比选项1要高得多。此外,一个用户在一个服务下,这意味着要遍历整个数组,寻找并消除它。我不知道你是专家,你有什么建议吗?所有这些都将上传到云(azure)上,所以所有的请求都将上传到云上

共有1个答案

益源
2023-03-14

备选方案2比备选方案1好。但是,恕我直言,还是不太好。

千万不要在数据列中存储逗号分隔的列表。如果你这样做了你会后悔的。(它们的搜索成本很高。)

你想要这样的东西。三个表,一个用于用户,另一个用于服务,还有一个所谓的联接表,在两者之间建立多对多的关系。

+-----------+    +-------------+     +-----------+
|user       |    |user_service |     |service    |
+-----------+    +-------------+     +-----------+
|user_id    +--->|user_id      |<----+service_id |
|givennamee |    |service_id   |     |name       |
|surname    |    +-------------+     +-----------+
|is_active  |
+-----------+

user_service中的每一行都意味着用户有权使用该服务。若要授权用户,请插入一行。若要吊销授权,请删除该行。

若要了解用户是否可以使用服务,请使用此查询。

SELECT user.user_id 
  FROM user
  JOIN user_service USING (user_id)
  JOIN service USING (service_id)
 WHERE user.givenname = 'Bill' AND user.surname='Gates'
   AND service.name = 'CharityNavigator'

如果查询返回user_id,则所选用户可以使用所选服务。

若要获取每个用户的服务列表,请使用此查询。

SELECT user.user_id, user.givenname, user.surname,
       GROUP_CONCAT(service.name) service_names
  JOIN user_service USING (user_id)
  JOIN service USING (service_id)
 GROUP BY user.user_id  

一些解释:几乎总是最好的方法是在表中为您的服务之类的东西构建行,而不是列或列中用逗号分隔的列表。为什么?

>

  • 您可以在几年后添加新的服务--只要您想要的数量就可以--而不需要重新工作数据库代码。

    DBMS(包括MySQL)可以很好地处理连接操作。

    在大多数关系数据库管理系统中,执行commalist_column SOMEHOW_CONTAINS(some_id)的效率低得令人恶心。执行column=some_id的效率要高得多,因为它可以使用html" target="_blank">索引。

    通常,列数较少的行比列数较多的行工作得更好。

    在生产中,向数据库中添加行要比添加列便宜得多。添加列意味着更改表定义。该操作可能需要停机。

    当您将列用于诸如服务之类的东西时,您正在创建一个封闭的系统。当您使用行时,您的系统是开放式的。

    我可以建议您阅读数据库规范化吗?不要被所有的CS行话吓倒。只需看看一些如何对各种数据库进行规范化的示例即可。

    也许读一下实体关系数据库建模?

  •  类似资料:
    • 我开始学习JSP和Tomcat容器,并且知道目录必须如何存储,但有几件事让我感到困惑: 如果我们只使用web app,为什么我们需要这里的其余文件夹?(突出显示为蓝色)。我可以只是删除他们和加载我的项目“web”作为根?

    • 我有一个quarkus应用程序,当我用下面的命令构建应用程序时,进程第一次开始完美地编译quarkus:dev-DskipTests=true 成功启动的日志: 但是当我停下来重新开始这个过程时,过程并没有开始... 启动失败的日志: 当我尝试重新启动机器,然后启动quarkus服务时,它会再次工作。 pom。xml: 如果有人遇到过类似的行为,请告诉我,这可能是什么根源。

    • 我希望基本上在我的应用程序内翻拍Kik。对于我在firebase聊天应用程序上看到的大多数指南,都有一个主要的消息节点,然后在该节点下面有一个扇出,每个用户都有引用主列表中消息的消息。 根据目前我的Firebase的布局方式,实现类似以下内容会更容易: 因此,当用户向对方发送消息时,我会更新发送者和用户下面的“聊天消息”节点。 有什么理由不这样做吗?我看到每个人都按照我描述的第一种方式进行,但我看

    • 问题内容: 我正在建立一个用于学习/实验和小型项目目的的小型MVC框架。由于完整的MVC框架和ORM对于仅几个数据库调用来说就算过头了,因此我需要了解模型内部的基础知识。 使用空类,在哪里我必须调用对象才能进行数据库调用? 在模型内部调用查询会是什么样子? 另外,在哪里可以找到MVC的初学者Web /书籍资源(包含许多示例代码)?我听说过很多术语,例如业务逻辑和数据库逻辑。我记得在某处读过,您应该

    • 我试图在使用OAuth2.0的移动应用程序的Web API中实现委托授权。根据规范,隐式授权流不支持刷新令牌,这意味着一旦某个访问令牌在特定时间内被授予,用户必须在令牌到期或被撤销时再次授予该应用程序的权限。

    • 我有一个Android应用程序和一个网络应用程序(托管在Firebase Hosting上)。Android 应用会生成数据并将其保存到 Firebase 实时数据库中。Android 应用和 Web 应用都可以查看数据。 从Firebase数据库生成数据PDF的最佳位置是哪里——Android应用程序还是Web应用程序(通过JavaScript,例如jsPDF)?它将保存在Firebase存储中