预约和行项目

2024-03-05

我正在构建一个管理应用程序来帮助管理我的移动汽车美容公司(希望还有其他公司)。我正在努力弄清楚如何对某些数据进行建模。

这个问题与我之前发布的问题相关,但我在下面转载了相关信息:数据库设计 - 谷歌应用引擎 https://stackoverflow.com/questions/3120192/database-design-google-app-engine

在此应用程序中,存在“约会”和“行项目”的概念。

预约是员工为了提供服务而需要到达的地点和时间。

行项目是服务、费用或折扣及其相关信息。可能进入约会的行项目示例:



Name:                          Price: Commission: Time estimate   
Full Detail, Regular Size:        160       75       3.5 hours 
$10 Off Full Detail Coupon:       -10        0         0 hours 
Premium Detail:                   220      110       4.5 hours 
Derived totals(not a line item): $370     $185       8.0 hours
  

在此应用程序的先前实现中,行项目包含在单个预约中。这在大多数情况下工作得很好,但有时会引起问题。举个例子,如果预约因下雨而中途中断,技术人员必须第二天回来完成工作。这种情况需要对同一行项目进行两次预约。在这种情况下,我会通过在第二次预约上设置“行项目”来读取诸如“完成”之类的内容来稍微捏造数据,然后成本将为 0 美元。

在下一版本中,我正在考虑使行项目与多个约会相匹配,其表结构如下所示:

Appointment
 start_time
 etc...

Line_Item
 appointment_Key_List
 name
 price
 etc...

这种结构的一个普遍问题是它很复杂,我什至不确定它是否适合将一个行项目与多个约会相匹配。如果行项目只能是一个约会的一部分,那么我实际上可以在每个约会中放入一个行项目列表,当我获得约会时,我已经获得了行项目。

一个更具体的问题是,我正在使用谷歌应用程序引擎,如果我想查询一组约会及其关联的行项目,我必须首先查询这组约会,然后对该行进行第二次查询items 使用 IN 运算符来测试 Line_Item 的任何约会键是否落入从先前查询返回的约会键集中。如果我有超过 30 个键要求我对查询进行分片,第二个查询将会失败。我可以对数据进行非规范化以避免这种复杂而广泛的读取查询,并且无论如何我可能都必须在某种程度上进行非规范化,但我宁愿在适当的情况下避免复杂性。

我的问题是这种情况通常是如何建模的?一个订单项与多个预约配对是否合适,或者简单地将订单项拆分为每个预约的单独项目是否正常,例如“两天工作的第一半”和“两天工作的第二半” ”。类似的成功应用程序是如何做到这一点的?在这种情况下,经验法则是什么?哪些实施结果证明问题较少?

Thanks!


您建议的方法效果很好;您可以将订单项的“appointment_Key_list”建模为列表属性,它将按您的预期工作。您不必使用 IN 运算符 - 这是为了将数据存储中的单个值与您拥有的键列表进行匹配(例如,“WHERE datastore_column IN ('a', 'b', 'c')),而您正在执行相反的操作 - 将单个值与数据存储中的列表进行匹配。

不过,我建议相反的做法可能更适合您的任务:让每个约会都有一个行项目键列表。其操作方式大致相同,但要检索约会的所有数据,您首先要获取约会,然后使用约会实体中的键对行项目进行批量获取。如果您知道约会的密钥,那么您就根本不需要进行任何查询。

我一直试图向 Pindatjuh 解释为什么查询列表属性的效率并不比单值属性低,但显然需要更详细的描述,所以言归正传,这里是......

App Engine 数据存储区索引简介

尽管 Python 和 Java 为数据存储提供了各种高级接口,但数据存储本身讲的是较低级抽象,称为实体。一个实体由以下部分组成:

  1. 唯一的主键
  2. (名称,值)对的列表

主键是您已经熟悉的数据存储区键。 (名称、值)对的列表是 App Engine 对实体中数据的表示。到目前为止就这么简单。具有以下值的实体:

a_string = "Hello, world"
an_int = 123

将被序列化为类似这样的内容:

[('a_string', 'Hello, world'), ('an_int', 123)]

但这如何与列表交互呢?嗯,列表被视为“多值”属性。也就是说,包含 n 个项目的列表存储为 n 个单独的属性。一个例子可能会让这一点更清楚:

a_string = "Hello, world"
an_int = 123
a_list_of_ints = [42, 314, 9]

将被序列化为:

[('a_string', 'Hello, world'), ('an_int', 123), ('a_list_of_ints', 42), ('a_list_of_ints', 314), ('a_list_of_ints', 9)]

正如您所看到的,该列表表示一系列值,所有值都具有相同的名称。当您从数据存储区加载数据时,SDK 会看到重复的值并将其转换为列表。

当它与索引交互时,这一点变得很重要。假设您在“a_string”和“an_int”上有一个索引。当您插入或修改一个值时,App Engine 会为其生成一组索引条目;对于上面的索引和上面的实体,它在索引中生成一行,如下所示:

('Hello, world', 123, a_key)

(这里的“a_key”是原始实体的键的占位符。)当您执行使用此索引的查询时,它只需要在索引上进行查找即可查找具有适当前缀的行(例如,“SELECT * FROM Kind WHERE a_string = "Hello, world" ORDER BY an_int')。

但是,当您为列表建立索引时,App Engine 会插入多个索引行。 'an_int' 和 'a_list_of_ints' 上的索引将为上述实体生成这些行:

(123, 42, a_key)
(123, 314, a_key)
(123, 9, a_key)

同样,查询的工作方式与以前相同 - App Engine 只需要在索引中查找具有正确前缀的行。列表中的条目数对查询速度没有影响,只影响生成和写入索引条目所需的时间。事实上,查询规划器不知道“a_list_of_ints”是一个多值属性 - 它只是将其视为任何其他索引条目。

简而言之:

  1. 在索引和查询方面,包含一个元素的列表与单个属性之间没有实际区别
  2. 索引列表的大小会影响索引所需的时间和空间,但不会影响查询所需的时间和空间。
  3. 您可以使用简单的等式过滤器执行查询,以匹配列表中具有给定值的任何实体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预约和行项目 的相关文章

  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • eclipse juno 打开时出错

    在安装 Eclipse 并正常工作一年多后 我今天打开 Eclipse Juno 并在打开工作区时收到一条错误消息 我使用的是 Windows 8 64 位 Java 64 位和 Eclipse 64 位 此后我尝试重新安装 Java 和
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • 仅包含主键和外键的数据库表的用途是什么?

    我试图理解一个简单的音乐数据库设计 有些表只包含外键和主键 我不确定如何以及何时使用这些表或向其中插入什么内容 设计如下 Track id primary key title duration live performance true o
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • org.hibernate.MappingException:没有 JDBC 类型的方言映射:1111

    我使用的是 postgres v8 3 它的列类型为 XML DDL 看起来像这样 CREATE TABLE contact ID INTEGER NOT NULL NAME VARCHAR NOT NULL Details XML 在映射
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 如何将 currentTimeMillis 转换为可读的日期格式? [复制]

    这个问题在这里已经有答案了 我想用currentTimeMillis两次 这样我就可以计算持续时间 但我也想以用户可读的格式显示时间和日期 我遇到了麻烦currentTimeMillis有利于计算 但我看不到内置函数可以转换为合适的时间或时
  • 将传入字符串的 unicode 表示形式转换为 UTF-8?

    我正在读取一些已经转换为 html 样式 代码的数据 我现在需要将其转换回 UTF 8 字符以供查看 不幸的是我无法使用浏览器查看该字符串 我读过有关 java 中的转换的内容 似乎如果你有一个 uxxxx 字符串 那么编译器会为你转换 然
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配

    当运行由maven构建的具有以下依赖项的项目时
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter

随机推荐

  • 在 LISP 中如何检查闭包中的自由变量?

    在 lisp 中 我可以像这样绑定在闭包中绑定的自由变量 let x 1 y 2 z 3 defun free variables x y z free variables 结果是 6 我想知道是否可以动态检查绑定的闭包变量 E g ins
  • 嵌入 python 错误 不支持按文件名导入

    我正在尝试将 python 嵌入到我的应用程序中 但很早就陷入了困境 我将 python 嵌入到我的 C 应用程序中并使用本教程中找到的代码 http docs python org 2 extending embedding html p
  • Android:使用 DrawableCompat 着色

    我正在尝试对 Android API 级别 21 之前的图像进行着色 我已经使用以下方法成功对项目进行了着色
  • XHR跨域限制的目的是什么?

    我一直想知道XHR跨域限制的目的是什么 其目的似乎是防止恶意注入的 Javascript 将私有数据发送给攻击者 然而 通过注入可以轻松地将数据发送到任何域script or img标签 或任何其他与此相关的外部资源 如果任意网站可以对您的
  • django Rest框架::传递原始查询

    是否可以在 django Rest 框架 如 django rest 中执行原始查询 https docs djangoproject com en dev topics db sql performing raw queries http
  • 在平板电脑模式下在最上面启动另一个应用程序

    当我从应用程序运行另一个 exe 时 它 在后台启动 并且不会在屏幕顶部显示该应用程序 而是显示平板电脑模式主屏幕 它在正常桌面模式下工作正常 但当我在 Windows 10 平板电脑模式下运行它时它不会显示在顶部 而是在后台启动 我用过m
  • 什么是UUID?

    嗯 什么是一 它是唯一标识某物的标识号 这个想法是 id 号码将是普遍地独特的 因此 任何两个事物都不应该具有相同的 uuid 事实上 如果您要生成 10 万亿个 uuid 则两个 uuid 相同的概率为 0 00000006
  • 模块自动加载就意味着可靠吗?

    环境 我有以下文件夹结构 用于保存 powershell 模块 C PsModules util util psm1 this contains implementation of Test Function util test ps1 f
  • 将枚举值映射到 TypeScript 中的各个类型

    我有一段 TypeScript 代码 如下所示 enum EventType EVENT A eventA EVENT B eventB more event types interface Event type EventType int
  • 在 Android 上开发电子邮件客户端应用程序

    我正在尝试开发一个用于在Android平台上发送和接收电子邮件的小应用程序 目前我一直在使用 Javamail api 尝试发送电子邮件 但是我想 如果我使用 javamail 实现我的应用程序 我将如何接收电子邮件并从我的应用程序收到我已
  • 一个 python 脚本可以同时运行 python 2.x 和 python 3.x

    我有数千台服务器 linux 有些只有 python 2 x 有些只有 python 3 x 我想编写一个脚本 check py 可以在所有服务器上运行 就像 check py 一样 无需使用 python check py 或 pytho
  • 如何将 Azure Active Directory 身份验证添加到 Razor Pages 应用程序?

    据我了解 您可以通过执行 新建项目 gt ASP NET Core Web 应用程序 gt 提供应用程序名称 gt Web 应用程序 在 Visual Studio 2019 中创建 Razor Pages 应用程序 以下教程演示如何将 A
  • 删除整数中的重复数字[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在技术回合中遇到过这个程序 他们给了我这个程序来删除给定整数中的重复数字不使用数组或字符串 Example int i 12313425
  • jquery change() 警报一键触发 6 次?

    jQuery document ready function c5sliderSelect change function alert change clicked 当我更改选择列表项时 我收到 6 条警报 不知道为什么 我的标记中只有一个
  • JTable 中特定列的比较器

    如何为 JTable 中的特定列设置自定义比较器 我的表的第三列包含双精度值的字符串表示形式 我想为该列创建一个比较器 以便当我单击该列的标题时 它将根据该比较器进行排序 第一个问题是 如果您正在管理双打 为什么您正在处理字符串 如果您使用
  • 防止 Backbone.js 模型在首次添加到集合时进行验证

    首次创建新模型时 有没有办法在 Backbone js 中抑制模型验证 在我的应用程序中 我有一个包含任意数量模型的集合 这些模型表示为列表项 用户可以单击每个项目上的按钮 这会在当前项目下方插入一个新的空项目 显然 空项目未通过验证 因为
  • 如何将 IPV6 地址转换为 IPV4 地址?

    我有使用 IPv4 地址的应用程序 它存储它们很长 因此它只理解 IPv4 地址 是否可以使用Java将IPv6地址转换为IPv4地址 While IPv4 地址范围有 IPv6 等效项 https en wikipedia org wik
  • archiveBaseName 应用于所有构建类型

    我有以下应用程序build gradle android compileSdkVersion 23 buildToolsVersion 23 0 1 defaultConfig applicationId io gresse hugo an
  • 使用 const 断言,如何从任意嵌套对象中提取文字类型?

    这个问题是后续问题this one https stackoverflow com q 76288737 6923555 其中我有一个深度为 2 的结构 const grandkids Karen Ava Alice Amelia Emma
  • 预约和行项目

    我正在构建一个管理应用程序来帮助管理我的移动汽车美容公司 希望还有其他公司 我正在努力弄清楚如何对某些数据进行建模 这个问题与我之前发布的问题相关 但我在下面转载了相关信息 数据库设计 谷歌应用引擎 https stackoverflow