【发布时间】:2015-04-07 14:40:44
【问题描述】:
我正在使用此SQLite Plugin 作为移动应用程序从“无限”存储限制中受益。基本上我有base64 imagedata 并且需要将它存储在数据库中。
此外,我还有一些其他表和一个 Masterdata,其中存储了主键以及一些附加信息,例如 albumName。
使用外键设置关系
为了处理数据库的关系方面,我最初使用外键声明并创建了如下表(为简单起见仅显示了两个表):
// Master Data
$cordovaSQLite.execute(db,
"CREATE TABLE IF NOT EXISTS \
Masterdata(\
id TEXT primary key, \
albumName TEXT, \
favorite INTEGER\
)"
)
// Images
$cordovaSQLite.execute(db,
"CREATE TABLE IF NOT EXISTS \
ImagesData(\
id TEXT, \
data BLOB, \
FOREIGN KEY(id) REFERENCES Masterdata(id)\
)"
)
然后,当我只想加载特定相册的图像时,我运行查询:
SELECT Masterdata.id, ImagesData.data FROM ImagesData, Masterdata WHERE Masterdata.album = (?) ["Some album name"]
这工作得很好(一切都按原样加载),但是我立即注意到在处理大型数据集时它会变慢。这是有道理的,因为 base64 字符串的存储空间非常广泛。
将 Blob 存储在单独的表中
所以我读了这个post,如果您的数据包含 BLOB,建议考虑将每个 BLOB 存储在单独的表中。
我编码如下:
// tableName in the form of 'id'_imagesData
// 'id' is stored also in Masterdata
$cordovaSQLite.execute(db,
"CREATE TABLE IF NOT EXISTS "
+ tableName + "(id integer, data BLOB)"
);
然后我使用查询将数据插入此表中:
"INSERT INTO " + tableName + " (id, data) VALUES (?,?)", parameters
// parameters = [0, base64_imageData_Str]
结果
结果是我注意到加载时间显着增加,即使存储了多个图像(因此有多个表)也是如此。在我看来,这是有道理的,因为我们可以使用 Masterdata 过滤掉选定的专辑 id,然后只从一个表中加载图像。
我的问题是:
- 这是一个坏的、好的还是好的做法?
- 拥有大量表格是否有缺点(例如,如果我有 1000 张图像,那么使用此设置我将拥有 1000 个表格)
- 如果这是不好的做法,有什么更好的推荐方法?
【问题讨论】:
标签: javascript database sqlite cordova hybrid-mobile-app