【问题标题】:Designing a Core Data managed object model for an iOS app that creates dynamic databases为创建动态数据库的 iOS 应用程序设计 Core Data 托管对象模型
【发布时间】:2015-02-08 14:09:00
【问题描述】:

我正在开发一个 iPhone 应用程序,供用户创建迷你数据库。用户可以创建自定义数据库架构并添加具有标准数据类型(例如字符串、数字、布尔值)以及其他复杂类型(例如对象和数据类型的集合(例如数字数组))的列。

例如,用户可以创建一个数据库来记录他的膳食。

膳食数据库:

[
  {
    "timestamp": "2013-03-01T13:00:00",
    "foods": [1, 2],
    "location": {
      "lat": 47.253603, 
      "lon": -122.442537
    }
  }
]

膳食-食物数据库:

[
  {
    "id": 1,
    "name": "Taco",
    "healthRating": 0.5
  },{
    "id": 2,
    "name": "Salad",
    "healthRating": 0.8
  }
]

为这样的应用程序实现数据库的最佳方法是什么?


我当前的解决方案是为应用创建以下数据库架构:

当用户如上例创建新的数据库模式时,定义表将如下所示:

+----+-----------+--------------+------------+-----------------+
| id | parent_id |     name     | data_type  | collection_type |
+----+-----------+--------------+------------+-----------------+
|  1 |           | meal         | object     |                 |
|  2 |         1 | timestamp    | timestamp  |                 |
|  3 |         1 | foods        | collection | list            |
|  4 |         1 | location     | location   |                 |
|  5 |           | food         | object     |                 |
|  6 |         5 | name         | string     |                 |
|  7 |         5 | healthRating | number     |                 |
+----+-----------+--------------+------------+-----------------+

当用户填充数据库时,记录表将如下所示:

+----+-----------+---------------+------------------------+-----------+-----+
| id | parent_id | definition_id |      string_value      | int_value | ... |
+----+-----------+---------------+------------------------+-----------+-----+
|  1 |           |             1 |                        |           |     |
|  2 |         1 |               | 2013-03-01T13:00:00    |           |     |
|  3 |         1 |             2 |                        |         1 |     |
|  4 |         1 |             2 |                        |         2 |     |
|  5 |         1 |             4 | 47.253603, -122.442537 |           |     |
+----+-----------+---------------+------------------------+-----------+-----+

有关此方法的更多详细信息:

  • 不同数据类型的值存储在记录表的不同列中。由应用程序正确解析值(例如,将时间戳 int_value 转换为日期对象)。

  • 必须在应用程序上执行约束和验证,因为这在数据库级别是不可能的。

这种方法还有哪些其他缺点,是否有更好的解决方案?

【问题讨论】:

  • 重新搜索“EAV”。提示:“用户可以创建自定义数据库模式”。那么管理 数据 base系统是什么?那么你的应用程序是什么,以及它是什么?那么如何避免为该功能编写代码呢?
  • Core Data 不是数据库,尝试使用它会导致绝望深渊。
  • @quellish 我知道 Core Data 就像 SQLite 之上的一个抽象层(如果它被选为存储)。将 Core Data 与 SQLite 结合使用有哪些更好的选择?
  • @zxzxlch Core Data 是一个对象图管理 API。这样使用它会产生最好的结果。 SQLite 是抽象接口后面特定具体存储的实现细节。

标签: ios core-data database-design architecture entity-attribute-value


【解决方案1】:

首先,您的Record 表效率非常低,并且有些难以使用。相反,您可以为需要支持的每种记录类型创建单独的记录表。这将大大简化一切并增加一些额外的灵活性,因为引入对新记录类型的支持不会有问题。

话虽如此,我们可以得出结论,拥有基本的表管理就足以使您的系统正常运行。自然有ALTER TABLE命令:

但在某些情况下,它可能非常昂贵,并且某些引擎有各种限制。例如:

SQLite 支持有限的 ALTER TABLE 子集。更改表 SQLite 中的命令允许用户重命名表或添加新的 列到现有表。

另一种方法可能是使用带有一些类型标签的 BLOB 来存储记录值。

这种方法将减少支持单独表格的需要。它把我们带到Schemaless approach

【讨论】:

  • 为每种记录类型创建单独的表是个好主意,谢谢。无模式数据库听起来很有趣,但有什么适合 iOS 的解决方案吗?
  • Schemaless 如果确实解决了问题,对于任何平台都是不错的。我想说简化设计在移动平台上更受欢迎。顺便说一句,例如 NanoStore 解决方案 (github.com/tciuro/NanoStore) 可以帮助您了解潜在的好处。
【解决方案2】:

您是否必须为此使用 CoreData? 使用无模式解决方案可能更有意义,例如http://developer.couchbase.com/mobile/develop/references/couchbase-lite/release-notes/iOS/index.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多