我正在开发一个介于电子邮件服务和社交网络之间的Web应用程序.我觉得它有可能在未来发展壮大,所以我担心可扩展性.
我决定为每个活跃用户创建一个单独的SQLite数据库,而不是使用一个集中式MySQL/InnoDB数据库然后对其进行分区:每个"分片"一个活跃用户.
这样,备份数据库就像每天一次将每个用户的小型数据库文件复制到远程位置一样简单.
扩展将像添加额外的硬盘来存储新文件一样简单.
当应用程序超出单个服务器时,我可以使用GlusterFS在文件系统级别将服务器链接在一起并运行应用程序,或者构建一个简单的SQLite代理系统,允许每个服务器操作相邻服务器中的sqlite文件.
并发问题将是最小的,因为每个HTTP请求一次只能触及一个或两个数据库文件,成千上万,而SQLite只会阻止读取.
我敢打赌,这种方法可以让我的应用程序优雅地扩展,并支持许多很酷和独特的功能.我打错了吗?我错过了什么吗?
更新我决定采用一种不太极端的解决方案,到目前为止工作正常.我正在使用固定数量的分片 - 准确地说是256个sqlite数据库.通过简单的散列函数将每个用户分配并绑定到随机分片.
我的应用程序的大多数功能每个请求只需要访问一个或两个分片,但有一个特别需要在256到10个不同的分片上执行简单查询,具体取决于用户.测试表明,如果所有数据都缓存在RAM中,则需要大约0.02秒或更短的时间.我想我可以忍受这个!
UPDATE 2.0我移植应用到MySQL/InnoDB和能够得到有关规则请求相同的性能,但对于需要碎片步行一个请求时,InnoDB快4-5倍.出于这个原因,以及其他原因,我正在放弃这种架构,但我希望某个地方找到它的用途......谢谢.
当我最初为我的应用程序创建一个带有预先插入数据集的SQLite数据库文件时,我必须将此文件放在我的Xcode项目中的某个位置,以便它转到我的iPhone应用程序.我想"ressources"是正确的选择.
在iPhone应用程序中部署SQLite数据库文件的基本"步骤"是什么?
我目前正在阅读整个SQLite文档,尽管与iPhone不太相关.
根据关于调试Core Data的Apple文档,它说我们应该能够将一个参数传递给应用程序,该应用程序将输出SQL核心数据发送给SQLite.
我已经进入XCode中我的可执行文件的参数选项卡并指定了参数:
-com.apple.CoreData.SQLDebug 1
Run Code Online (Sandbox Code Playgroud)
但是,我在控制台中看不到SQL.然后我尝试在Apple提供的CoreDataBooks应用程序中使用此参数,以防我的程序中出现其他问题.
即使在Apple的示例中,我在控制台中也没有输出SQL.
难道我做错了什么?Apple的文档错了吗?我应该寻找控制台以外的其他地方吗?有没有其他人在这个论点上取得成功?
更新: Apple已经修复了新版XCode的输出错误; 但是,要明确最终的解决方案:
参数是两个单独的参数,应该在参数选项卡中输入.-com.apple.CoreData.SQLDebug是一个参数,值1是第二个参数.
我正在使用SQLite和C#,并且有一些表定义了外键.
现在,我知道默认情况下,SQLite中没有强制执行外键约束,但是我想将它们打开.
是否可以通过代码执行此操作?我查了一个相关的问题,但我不知道如何通过C#代码来完成.我正在使用Visual Studio 2008中最新的SQLite插件来设计我的表.
conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery();
conn.Close();
Run Code Online (Sandbox Code Playgroud)
重新打开此连接时,我需要保持此更改.可能吗?
我用Google搜索了一整天,没有运气.getnPrintAllData()按OK按钮后调用方法.所以代码是:
public class DatabaseSQLiteConnection {
Connection conn = null;
PreparedStatement statement = null;
ResultSet res = null;
public DatabaseSQLiteConnection(){
try{
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:test.sqlite");
statement = conn.prepareStatement("SELECT * from product_info;");
}
catch(Exception e){
e.printStackTrace();
}
}
public void getnPrintAllData(){
String name, supplier, id;
DefaultTableModel dtm = new DefaultTableModel();
Window gui = new Window(); //My JPanel class
try{
res = statement.executeQuery();
testResultSet(res);
ResultSetMetaData meta = res.getMetaData();
int numberOfColumns = meta.getColumnCount();
while (res.next())
{
Object [] rowData = new Object[numberOfColumns]; …Run Code Online (Sandbox Code Playgroud) 在Android 4.2中,使用SQLite 3.7.11,当我从Quizzes表中删除一行时,下面是谁的模式,QuizQuestions表中的相应行不会被删除.
我无法弄清楚出了什么问题.我试过推杆
db.execSQL("PRAGMA foreign_keys = ON;");
Run Code Online (Sandbox Code Playgroud)
create table语句之前和之后.
创建表语句:
CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE);
CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER,
PRIMARY KEY(quiz_name, question_id),
FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE,
FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE);
Run Code Online (Sandbox Code Playgroud) 我的应用需要与其他应用用户同步(在自己的设备上).我还想支持离线编辑,当用户连接到互联网时,这些编辑会与其他协作用户同步.
因此,用户A改变(当他离线时)一些数据(换句话说,他将更新数据库条目)或向数据库添加新记录.当用户A连接到互联网时,所有更改和新记录都将传递给其他协作用户.因此,用户B将获得更改/更新,并可以将其插入/更新到用户B本地设备数据库中.
但我需要确保数据库条目的ID在整个系统中是唯一的.因此我需要使用像UUID这样的东西.
我的问题:在android sqlite数据库表中使用UUID(String/Varchar)作为主键而不是自动递增的整数是不是一个坏主意?
我想通过使用字符串(UUID有36个字符)作为主键会出现性能问题.
我想索引uuids而不是整数需要更长的时间(比较字符串与比较整数).我还猜测,当我使用UUID时,每次插入新的数据库记录/条目时,数据库都需要重新索引主键列,因为它们的主键索引不再处于排序顺序(这将是我何时使用整数自动递增主键,因为每个未来的记录都会在末尾添加,因为新的自动递增的主键始终是目前为止最大的数字,因此索引将自动按排序顺序排列).我还需要做的是加入2到3张桌子.我还猜测,比较JOINS上的字符串而不是整数会减慢数据库查询的速度.
但是我无法看到实现这种协作同步系统的任何其他可能性,所以我必须使用UUID,对吧?
另一种可能性是使用整数自动增量主键并使用第二列uuid.因此,为了处理用户本地设备,我将使用此主键(整数)进行JOINS等,而我将使用uuid列与其他用户进行同步.
你们对这种方法有什么看法,或者你认为有多少工作,因为你不会期望UUID直接作为主键出现重大的性能问题?
还有其他建议吗?
我收到这个错误 -
07-03 12:29:18.643: E/SQLiteLog(5181): (1) table accounts has no column named otherNotes
这是我的代码:
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "accountsManager";
private static final String TABLE_ACCOUNTS = "accounts";
private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_USERID = "userId";
private static final String KEY_PASSWORD = "password";
private static final String KEY_LOGINURL = "loginUrl";
private static final String KEY_OTHERNOTES = "otherNotes";
public DatabaseHandler(Context context) …Run Code Online (Sandbox Code Playgroud) 在 为表定义模式时INT PRIMARY KEY和之间有什么区别 INTEGER PRIMARY KEY吗?当使用int主键时,我得到了生成的sqlite_autoindex 东西 ; 当整数主键,我得到sqlite_sequence表生成.有什么不同?什么副作用可以有第一和第二变种?
我ContentProvider使用以下行为我创建了一个表 :
static final String CREATE_DB_TABLE =
" CREATE TABLE " + CONTACTS_TABLE_NAME +
" (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" pid TEXT NOT NULL, " +
" name TEXT NOT NULL,"+
"number TEXT NOT NULL);";
Run Code Online (Sandbox Code Playgroud)
它有4列.现在我想添加一个布尔值为true/false的列.如果我必须添加一个名为"status"的布尔列,我如何添加append/change这个语句.
sqlite ×10
android ×4
iphone ×2
sql ×2
ado.net ×1
architecture ×1
c# ×1
cocoa ×1
core-data ×1
database ×1
debugging ×1
foreign-keys ×1
java ×1
jtable ×1
performance ×1
primary-key ×1
scalability ×1
sharding ×1
swing ×1
uuid ×1