2014-08-27 40 views
0

我已经想出了我的大部分数据模型用于新的iOS应用程序,现在我遇到了一个我一直在考虑的问题。对于iOS应用程序没有NULL值和重复数据库的数据库设计

'实验'具有名称,描述和所有者。它还有一个“行动”和一个“事件”。

'事件'可能是不同的事物:时间,地点或速度。

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

每个'Type'都有一个值,它具有唯一的数据类型。时间一次性可以是下午12:15的日期值,位置精确可以是(30.0,-20.0)的GeoPoint值。

的问题

  • 如何设计数据模型,使数据库不与NULL值千疮百孔 ?
  • 如果我添加更多“事件” 和“类型”,我如何设计数据模型为可扩展的。

思考

做实验只有一个动作,一个事件,那将是错误的,这两个进不同的表分开,但不这样做会导致该实验台是全空的值,因为我必须有Event,Event Type和Event Type Value的列来补偿可能为事件类型值输入的所有可能数据类型。 (日期,整数,字符串,地址点等)

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

也许我过于复杂的事情,也许我错过了这么简单的事情,我要踢我自己当我看到它。

回答

1

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

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

(编辑:下一次更换图表中的“事件”的关系,位置&速度“事件类型”) enter image description here

+0

威基德,谢谢你,这图是一个巨大的帮助。有一件事 - EventType只有一种类型,而不是全部三种。因此无论是时间,地点还是速度。 – jcrowson 2014-08-27 19:05:09

+0

很酷。如果事件类型不仅仅是一个名字(即一个列表),那么你可能想要将它们表示为模型中的对象(我不确定你想要做什么)。如果这是你所说的那么肯定放弃这3个实体,你应该是好的。我在想这个的方式是一个事件可以关联到3种不同的事件类型之一。事件类型实体将保存该类型的描述性信息,而时间,位置,速度将保存与这些对象相关的细节(例如时间:日期,时间,时间范围,时区等等)。祝你好运。 – Wizkid 2014-08-27 19:10:22

+0

事情是 - 我认为他们作为对象更好。问题是创建这三个对象和Event Type对象之间的关系,而不创建NULL值,因为只有1是必需的,所以其他两个将是NULL。如何从Event类型对象中只引用一个对象而不需要两个以上的空指针? – jcrowson 2014-08-27 19:14:52

相关问题