【发布时间】: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