- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在为一个新的 iOS 应用弄清楚我的大部分数据模型后,我现在遇到了一个我已经思考了一段时间的问题。
“实验”有名称、描述和所有者。它还具有一项“操作”和一项“事件”。
“事件”可以是不同的事物:时间、地点或速度。
根据“事件”是什么,它可以有不同的“类型”。例如,时间可以是一次性的、间隔的、日期范围的、重复的或随机的。位置可以是区域或确切位置。
每个“类型”都有一个值,该值具有其自身唯一的数据类型。一次性时间可以是中午 12:15 的日期值,精确位置可以是 GeoPoint 值 (30.0, -20.0)。
问题
想法
由于实验只有一个操作和一个事件,因此将这两个分开到不同的表中是错误的,但是不这样做会导致实验表充满 NULL 值,因为我必须有列对于事件、事件类型和事件类型值,以补偿可以为事件类型值输入的所有可能的数据类型。 (日期、整数、字符串、地理点等)
将事件和事件类型分离到一个单独的表中可能会解决 NULL 值问题,但是我会留下重复的数据,特别是在事件类型一次性为 12:00pm 的情况下,如这会存在于其他实验中,而不仅仅是一个。 (除非我创造每一种可能性并用这些填充一个单独的表 - 我怎么能轻松地做到这一点?)
也许我把事情过于复杂化了,也许我错过了一些如此简单的事情,以至于当我看到它时我会踢自己。
最佳答案
您需要根据对象而不是表格来考虑您的数据模型。核心数据与对象图一起工作,因此核心数据中的所有内容都是对象。在 Objective-c 中,你使用的是对象。这就是为什么你不需要 ORM 工具。如果你从对象的角度思考,那么我认为下面的模型(显然需要工作,但你应该明白这一点)是有道理的。将您的概念分离成这样的对象的好处是您可以从多个角度看待您的问题。换句话说,你可以从实验角度或事件角度来看它。我怀疑您会想要对数据做一些事情,例如在代码中使用时间对象显示在日历上或设置提醒。获取特定类型的所有实验的所有事件等。通过将这些数据项封装在核心数据的对象中,一切都准备好供您在代码中利用、操作和修改。它还消除了您发现的空值问题。因为您不会为空值创建对象,而只会为与您的实验相关的值创建对象。话虽这么说,您可能希望根据程序的具体情况进一步分解模型。另外,如果设计得当,就不会有您提到的重复数据问题。同样,您处理的不是表中的行,而是对象。如果您使用“一次性 12:00pm”创建事件类型对象,则可以通过该事件类型对象的关系将该事件类型对象分配给您希望的任意数量的事件。您不必再次创建该对象,只需引用它即可。当您想到这些关系时,您会想到“X 可以与 Y 关联”。例如,“一个实验只能与 1 个事件关联”、“一个事件类型可以与多个事件关联”、“一个事件只能与 1 个事件类型关联”。采用这种方法可以为您以后的可扩展性做好准备。想象一下您想要添加一个新的事件类型。您只需创建一个新的事件实体并将其关联到您的事件类型实体即可。
我的建议是考虑您的对象模型,以及您预期如何在代码中使用对象(以及您预期如何通过查询访问对象)。这应该有助于驱动您如何构造它(例如,如果您需要一个时间对象,那么请确保您的对象模型中有它。如果您需要一个警报对象,那么请确保您的对象模型中有它)。让模型为您完成工作,并尽量不要编写大量代码来组装 Objective-C 中的对象模型的等效项,或者开始在代码中创建对象并使用数据存储中的数据填充它们。
(编辑:将图中时间、位置和速度下的“事件”关系替换为“事件类型”)
关于ios - iOS App 无 NULL 值和重复数据的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532067/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!