用Sqlite3 构建中小型网站数据库

     最近接触了一段时间的 Sqlite3 数据库,越来越喜欢这个轻巧的数据库了。其优点是不需要安装,体积小;程序中使用也不需服务器安装额外的驱动程序,这点在嵌入式开发中优势显而易见; 不过对于用惯了图形化界面操作的我来说,刚开始还不太习惯,操作尤其不方便;在网上看了一下资料,大致说其性能是和 Access 有得一拼(基本上是处于一个数量级上);我在想:对于一个用户几百万的网站来说能不能使用这一轻量级的数据库呢?我觉得可行。在数据库调优中我们常见的是分库分表,这个完全可以用于 Sqlite3 上,我的思路是:比如站点共有100万用户, 有一个要求是用户的每个动作都要记录,例如每发表一篇博文,都要记录其发布时间,发布 ip等信息, 而这个信息在其个人动态中展示出来,这个时候我们可以设计一个库出来: templateDB.db3 : 其中一个表结构如下(sample):

假如某个用户的 userid = 1051170 ; 那么我们可以通过一定的算法: userid/1000 = (int)1051 (意即每个 db 只服务于 1000 个用户的某些模块)将其放在 /data/action_1051.db3 中,在做插入之前检查一下 该库是否存在,如不存在则拷贝一份 templatedb 到为目标库;这样能很大程度上减少了数据并发带来的锁问题,减轻主数据库服务压力。
    当然这样的设计也有不足之处:假如在投入实际生产过程一段时间后 ,我们需要改变表的某些结构或增加某个模块,这个改动将是灾难性的。




最后附上使用笔记(我使用的是 ms Entlib 4.1框架 + vs 2008 ):
1. 到官方网站下载 http://www.sqlite.org/ 下载 sqlite3 并创建数据库及表;
2. 到 http://sqlite.phxsoftware.com/ 上下载 System.Data.SQLite.dll ,然后在项目中添加引用;
3. web.config 配置

1     <connectionStrings>
2         <add name="sqlite" connectionString="data source= E:/workspace/CSharpTest/SQLiteApp/App_Data/userscore.db" providerName="System.Data.SQLite"/>
3     </connectionStrings>
4 

4. 查询:

查询数据
 1         private void bind() {
 2             Database db = DatabaseFactory.CreateDatabase("sqlite");
 3             string sql = "select * from userAction ";
 4             DataSet ds = db.ExecuteDataSet(CommandType.Text, sql);
 5             if (ds != null)
 6             {
 7                 if (ds.Tables[0].Rows.Count > 0)
 8                 {
 9                     gdvlist.DataSource = ds;
10                     gdvlist.DataBind();
11                 }
12             }
13         }
14 

5. 增加数据:

插入数据
 1         protected void Button1_Click(object sender, EventArgs e)
 2         {
 3             Database db = DatabaseFactory.CreateDatabase("sqlite");
 4             string sql = "insert into userAction(userid, username,nickname, scoretype, score, content, addip) "
 5                         + "values(@userid, @username,@nickname, @scoretype, @score, @content, @addip) ";
 6             DbCommand cmd = db.GetSqlStringCommand(sql);
 7             db.AddInParameter(cmd, "@userid", DbType.String, int.Parse(tbuid.Text) );
 8             db.AddInParameter(cmd, "@username", DbType.String, tbuserName.Text);
 9             db.AddInParameter(cmd, "@nickname", DbType.String, tbnick.Text);
10             db.AddInParameter(cmd, "@scoretype", DbType.String, tbsctype.Text );
11             db.AddInParameter(cmd, "@score", DbType.Int32, int.Parse( tbscore.Text) );
12             db.AddInParameter(cmd, "@content", DbType.String, tbcontent.Text);
13             db.AddInParameter(cmd, "@addip", DbType.String, Request.UserHostAddress);
14             db.ExecuteNonQuery(cmd);
15             Response.Write("成功!");
16             bind();
17         }
18 


效果:

呵...和其他数据库操作没有两样。







原文地址:https://www.cnblogs.com/infozero/p/1618202.html