gpt4 book ai didi

ios - iOS App 无 NULL 值和重复数据的数据库设计

转载 作者:行者123 更新时间:2023-11-29 02:42:57 25 4
gpt4 key购买 nike

在为一个新的 iOS 应用弄清楚我的大部分数据模型后,我现在遇到了一个我已经思考了一段时间的问题。

“实验”有名称、描述和所有者。它还具有一项“操作”和一项“事件”。

“事件”可以是不同的事物:时间、地点或速度。

根据“事件”是什么,它可以有不同的“类型”。例如,时间可以是一次性的、间隔的、日期范围的、重复的或随机的。位置可以是区域或确切位置。

每个“类型”都有一个值,该值具有其自身唯一的数据类型。一次性时间可以是中午 12:15 的日期值,精确位置可以是 GeoPoint 值 (30.0, -20.0)。

问题

  • 如何设计数据模型才能使数据库不困惑带有 NULL 值?
  • 如果添加更多“事件”,如何设计可扩展的数据模型和“类型”。

想法

由于实验只有一个操作和一个事件,因此将这两个分开到不同的表中是错误的,但是不这样做会导致实验表充满 NULL 值,因为我必须有列对于事件、事件类型和事件类型值,以补偿可以为事件类型值输入的所有可能的数据类型。 (日期、整数、字符串、地理点等)

将事件和事件类型分离到一个单独的表中可能会解决 NULL 值问题,但是我会留下重复的数据,特别是在事件类型一次性为 12:00pm 的情况下,如这会存在于其他实验中,而不仅仅是一个。 (除非我创造每一种可能性并用这些填充一个单独的表 - 我怎么能轻松地做到这一点?)

也许我把事情过于复杂化了,也许我错过了一些如此简单的事情,以至于当我看到它时我会踢自己。

最佳答案

您需要根据对象而不是表格来考虑您的数据模型。核心数据与对象图一起工作,因此核心数据中的所有内容都是对象。在 Objective-c 中,你使用的是对象。这就是为什么你不需要 ORM 工具。如果你从对象的角度思考,那么我认为下面的模型(显然需要工作,但你应该明白这一点)是有道理的。将您的概念分离成这样的对象的好处是您可以从多个角度看待您的问题。换句话说,你可以从实验角度或事件角度来看它。我怀疑您会想要对数据做一些事情,例如在代码中使用时间对象显示在日历上或设置提醒。获取特定类型的所有实验的所有事件等。通过将这些数据项封装在核心数据的对象中,一切都准备好供您在代码中利用、操作和修改。它还消除了您发现的空值问题。因为您不会为空值创建对象,而只会为与您的实验相关的值创建对象。话虽这么说,您可能希望根据程序的具体情况进一步分解模型。另外,如果设计得当,就不会有您提到的重复数据问题。同样,您处理的不是表中的行,而是对象。如果您使用“一次性 12:00pm”创建事件类型对象,则可以通过该事件类型对象的关系将该事件类型对象分配给您希望的任意数量的事件。您不必再次创建该对象,只需引用它即可。当您想到这些关系时,您会想到“X 可以与 Y 关联”。例如,“一个实验只能与 1 个事件关联”、“一个事件类型可以与多个事件关联”、“一个事件只能与 1 个事件类型关联”。采用这种方法可以为您以后的可扩展性做好准备。想象一下您想要添加一个新的事件类型。您只需创建一个新的事件实体并将其关联到您的事件类型实体即可。

我的建议是考虑您的对象模型,以及您预期如何在代码中使用对象(以及您预期如何通过查询访问对象)。这应该有助于驱动您如何构造它(例如,如果您需要一个时间对象,那么请确保您的对象模型中有它。如果您需要一个警报对象,那么请确保您的对象模型中有它)。让模型为您完成工作,并尽量不要编写大量代码来组装 Objective-C 中的对象模型的等效项,或者开始在代码中创建对象并使用数据存储中的数据填充它们。

(编辑:将图中时间、位置和速度下的“事件”关系替换为“事件类型”) enter image description here

关于ios - iOS App 无 NULL 值和重复数据的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com