如何建立一个最简单的数据库

bnm77 2008-10-06 11:02:31
在VC之下,现在有一个字符数组A[],以这个字符数组为基础,如何建立一个简单的数据库。就是逻辑上可以是记录、字段等等,但实质上都归为一个字符数组。
只是建立最简单的数据库。
是否有现成的函数或组件一类的东西。
...全文
2113 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
chubiao1126 2010-07-06
  • 打赏
  • 举报
回复
(玉龙猪) 你的方法很好。谢谢。
jxufeng 2008-12-12
  • 打赏
  • 举报
回复
楼主还在搞吗,可以讨论一下。
关于buffer,用c++如下:
char* buffer=new char[1024*1024];//1m可以用BYTE,windows下BYTE=unsigned char
memset(buffer,0,1024*1024);//这个很重要的,release下才会真正的计算出系统还剩有多少ram
double a=1020.22222;
//写数据
memcpy(buffer+n,&a,sizeof(a));//给buffer赋值,n为一个小于1024*1024的整数
//读数据
double* b;
b=(double*)buffer+n;//或者double b,memecpy(&b,buffer+n,8);sizeof(double)=8

对于每一条记录,可以定义一个structure
{
字段一 记录偏移量n
字段二 记录偏移量n1
.............
}
网上的关于缓存的东西不少,可以多看看。关于new与api的关系,可以看看windows核心编程,还有内存分页、虚拟内存、以及最关键的内存碎片问题。
然后,要考虑做索引和sql解析

似乎把数据结构和算法这本书看懂了就可以了,然后一定要把c++精通。
建议用c来写,很多这方面的学术文章都是c写的,而且大都既不是windows也不是linux/unix操作系统;所以用c写能更好的移植。
KeSummer 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jxufeng 的回复:]
API编程来存取数据就是使用Windows SDK API开发应用程序进行数据处理的过程,API就是一种函数,就是Windows的32位应用程序编程接口。

jxufeng的思路还是比较对的,但是事情可能没那么复杂。就是建立一个buffer,然后把数据以结构体的方式写入和读出,由于不需要做通用化处理,字段及其设置直接编到程序里面,int4个字节转换成多个字节的char。数据查询就采用折半查找,这里面最麻烦的事情是那些眼花缭乱的数据类型转换。

那根…
[/Quote]

实时内存数据库eXtremeDB还满足不了你吗?还要瞎搞~~下面是一些参考的数据:

eXtremeDB实时数据库成功帮助中国监测电网状态

华东成千上万的企业及家庭用户今后将拥有更加可靠的电力供应,因为电网中将有一种新型监测系统对电力系统的运行情况进行监测,而这个系统中的实时数据管理将由McObject公司发布的eXtremeDB内存式实时数据库来完成。这种新型的监测系统就是由电力科学研究院研制的基于PMU的发电厂就地监测系统。
eXtremeDB的数据库系统以C/C++的Library的形式提供给用户,与用户的程序无缝集成在一个运行程序之中。开发过程流畅,使用非常方便。

eXtremeDB首先是实时数据库。在Pentium 4/2.4GMHz的台式机上,eXtremeDB的插入速度可以达到微秒一级:

  Insert ……………………100000 objects: 315 milliseconds,(3 microsecs/object)

  Creating tree ………………100000 objects: 271 milliseconds (2 microsecs/object)

  Hash search ………………100000 searches: 63 milliseconds (0 microsecs/search)

  Tree search …………………100000 searches: 271 milliseconds (2 microsecs/search)

  Sequential …………………100000 searches: 30 milliseconds (0 microsecs/search)

  Removing the tree ………2 milliseconds

  Search/delete ………………100000 objects: 321 milliseconds (3 microsecs/object)






其实你的需求还达不到这一级呢。。。用sqlite或者BDB的内存表功能即可。
nieoding 2008-11-08
  • 打赏
  • 举报
回复
简单的来说用xml,ini,jason都能解决这个问题,都有相关库直接使用
如果复杂一点可以用文件型数据库sqlite,

用到sqlserver确实有点大炮打苍蝇
但是要自己去写数据库,也有点BT了
sanshao27 2008-11-06
  • 打赏
  • 举报
回复
见识了
KeSummer 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bnm77 的回复:]

楼上二位可能以为ACCESS和SQLSERVER能覆盖所有的数据库应用,其实不然,在某些对速度要求较高的应用中,这二种数据库都不能卯足要求。有些应用,还要利用API编程来存取数据,而不能用数据库里提供的SQL读取数据......  跑题了。
还是重复一下我的问题,在VC之下,现在有一个字符数组A[],以这个字符数组为基础,如何建立一个简单的数据库。
[/Quote]

我只知道对速度要求较高的应用中都使用 内存数据库和实时数据 这类东西。

实时数据库是数据库系统发展的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。

内存数据库和实时数据库:目的是管理实时数据;手段是存储在内存里。举个例子说:雷达中坐标数据是实时数据,用常规的数据库来管理速度上就跟不上,因为常规数据库都是建立在磁盘上的。有些数据库建在内存盘中,插入记录的速度比磁盘提高几倍。另一种也把内存作为存储介质,但不是以文件方式保存,是程序数据方式。速度就快多了。真正意义上面的“IN-MEMORY DBMS”技术直接将数据以应用程序的格式保存在主内存中,从根本上面踢出I/O 、文件系统所需的缓冲和CACHE MECHANISM.此外,内存数据库的性能很高(当然也包括数据存储的效率)。内存数据库凭借其稳定性 强壮性 可靠性 高度的可拓展性为关键性的领域提供高实时的数据管理方案。
jxufeng 2008-11-06
  • 打赏
  • 举报
回复
API编程来存取数据就是使用Windows SDK API开发应用程序进行数据处理的过程,API就是一种函数,就是Windows的32位应用程序编程接口。

jxufeng的思路还是比较对的,但是事情可能没那么复杂。就是建立一个buffer,然后把数据以结构体的方式写入和读出,由于不需要做通用化处理,字段及其设置直接编到程序里面,int4个字节转换成多个字节的char。数据查询就采用折半查找,这里面最麻烦的事情是那些眼花缭乱的数据类型转换。


那根本就不是问题了,适当的用memcpy即可以搞定了。数据类型不用想得复杂,例如
double 8个字节,你定义一个buf[1024],里面可以存储int ,long ,double,char等类型的数据,假如第300的位置是你要取的double很简单,
double a;
memcpy(a,buf,300,8);//注意是不是写错了,伪码
308以后就是别的数据了,其他的数据类型都是类似的。
你的结构体内有字符串(或者其他变长的情况,比如结构体内含有动态数组)的话,这就需要首先取得结构体实体的长度,然后累加各个结构体的位置;当然你也可以另外搞个buf专门存储字符串,而在结构体内记录字符串的起始位置。其实这与二进制文件(例如你去解读cad的dwg文件或者excel文件,就是这样一点一点的读出来的)的读法是一样的,不就是一个所谓串行化的问题吗?没想到你被这个小问题给郁闷了!
不过这与api关系不大,纯粹的c++。当然,具体应用过程中在开辟内存时,在一些特殊情况下,确实需要使用到api。如果你有兴趣,还可以看看汇编的相关东西,好像能提高不少性能,我也在研究。
我在写atlserver应用程序时,用到缓存时,就是这样处理的。
我大概写了10w个点(一个“两个double,一个char[48]”的结构体,为了省事,我没有用变长的字符串,这样每个结构体就是64,这里需要考虑对齐,这样我就每次以64的若干倍 memcpy 来读取数据),因为缓存(足够大的buffer)上开辟在iis的堆上(我是这么认为的,确实只能使用api heapalloc开辟的内存,而不是new 和 alloc),而每次网页访问是iis下的一个线程,我就能用一个算法找到缓存上合适位置的点数据,性能非常的好。不过,我的这种办法在c#-asp.net里面非常容易实现,太太太简单了,而且好像性能还要好些,除了内存消耗了大概10倍以外!

最后,一定要考虑内存的使用,2g的限制(还有其他数据啊),所以我也不知道我的程序会怎样,当iis运行太多的其他程序,而用户又比较大的时候,估计得死翘翘,虽然目前的压力测试还可以。也希望有识之士能给我个建议!
KeSummer 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jxufeng 的回复:]
为什么会有数据库出来,我觉得是这样的原因:
内存的大小远远比硬盘小,尤其在早期的时候。
数据保存的方式有很多种,例如文本文件记录,一条一条的,当文件特别大(远远大于内存)的时候,你不能一次把文件都读入到内存中吧,你只一行一行得去读文件。假如查找某一个记录,我们知道的算法有很多,比如折半查找,这都是操作内存中的数据(数组啊),但是对于那个大文件怎么办呢?于是就出现了数据库的索引,即在内存中存放关键字…
[/Quote]

也有内存数据库这个东西,数据完全就是存在内存里面,很明显与你说的相违背,数据库的存在就是为了把数据和逻辑处理分开。。

建议LZ看看Sleepycat的BDB,Firebird,sqlite,fastdb等,开阔一下眼界。。
路人乙2019 2008-11-06
  • 打赏
  • 举报
回复
定义一个文件头,写个文件就是了。
scq2099yt 2008-11-05
  • 打赏
  • 举报
回复
可以将数据库表格看成是文件,可以是文本文件或者XML文件
bnm77 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jxufeng 的回复:]

什么叫用api来存取数据?!你说的速度要求较高的应用,其实也有很多解决方案,比如…
[/Quote]

API编程来存取数据就是使用Windows SDK API开发应用程序进行数据处理的过程,API就是一种函数,就是Windows的32位应用程序编程接口。

jxufeng的思路还是比较对的,但是事情可能没那么复杂。就是建立一个buffer,然后把数据以结构体的方式写入和读出,由于不需要做通用化处理,字段及其设置直接编到程序里面,int4个字节转换成多个字节的char。数据查询就采用折半查找,这里面最麻烦的事情是那些眼花缭乱的数据类型转换。
snowdot84 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bnm77 的回复:]

楼上二位可能以为ACCESS和SQLSERVER能覆盖所有的数据库应用,其实不然,在某些对速度要求较高的应用中,这二种数据库都不能卯足要求。有些应用,还要利用API编程来存取数据,而不能用数据库里提供的SQL读取数据...... 跑题了。
还是重复一下我的问题,在VC之下,现在有一个字符数组A[],以这个字符数组为基础,如何建立一个简单的数据库。
[/Quote]

你说的使用API编程存取数据,是指自己设计存储结构,保存在文件里吗?
还是指使用API来访问数据库?
要是后面一种情况,其实兄弟你就理解错了,你所用的SQLServer只是客户端,我想它也是使用API访问数据库的。。
snowdot84 2008-11-04
  • 打赏
  • 举报
回复
这是创建表的
如果想从一个数组创建数据库,就要自己 根据数据组织sql 语句,然后再创建表。。
#define SQL_TABLE_USER "create table DIARY_USER(u_id int identity ,u_name text(20) NOT NULL,u_password text(250) NOT NULL,primary key (u_id))"

static BOOL CreateTables(void)
{
HRESULT hr=S_OK;

try
{
variant_t vRecords;
m_pConnect->CursorLocation=adUseClient;
hr=m_pConnect->Execute(_bstr_t(_T(SQL_TABLE_USER)),&vRecords,adExecuteNoRecords);
if (FAILED(hr))
{
return FALSE;
}
return TRUE;
}
catch (_com_error & )
{
return FALSE;
}
return FALSE;
}
snowdot84 2008-11-04
  • 打赏
  • 举报
回复
不明白你的意思,,

请参考
这是创建Access数据库的
#define SQL_CONNECT_STRING "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DATA.DB;Jet OLEDB:DataBase password=123"
static BOOL CreateDataBase(void)
{
HRESULT hr=S_OK;

CString strcnn(_T(SQL_CONNECT_STRING));

try
{
ADOX::_CatalogPtr m_pCatalog=NULL;
hr=m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));

if (FAILED(hr))
{
return FALSE;
}
else
{
hr=m_pCatalog->Create(_bstr_t(strcnn));

if (FAILED(hr))
{
return FALSE;
}
else
{
return TRUE;
}
}
}
catch (_com_error & e)
{
int i=e.WCode();
if (0xc17==e.WCode()||0==e.WCode())
{
return TRUE;
}
else
{
MessageBox(NULL,e.Description(),_T("错误"),NULL);
return FALSE;
}

}
return 0;
}
jxufeng 2008-11-03
  • 打赏
  • 举报
回复
楼上二位可能以为ACCESS和SQLSERVER能覆盖所有的数据库应用,其实不然,在某些对速度要求较高的应用中,这二种数据库都不能卯足要求。有些应用,还要利用API编程来存取数据,而不能用数据库里提供的SQL读取数据...... 跑题了。
还是重复一下我的问题,在VC之下,现在有一个字符数组A[],以这个字符数组为基础,如何建立一个简单的数据库。

什么叫用api来存取数据?!你说的速度要求较高的应用,其实也有很多解决方案,比如asp.net的缓存技术,其本质是在iis进程的堆上开辟空间,多线程访问,javabeans也有类似的功能,当然抛开他的内存占用非常大不说了,仅仅是个例子。
如果你非要作,其实可以考虑所谓的内存数据库技术,网上有些模型的。
要说也不是很难,你所说的字符数组,其实就是一个char的buffer。目前windows下一个进程作多能够使用2g的内存,那么你的
buffer肯定要少于2g,因为程序还需要很多别的内存空间。建立好buffer以后,那就是指针操作了,一个int是4位等等的了;实质上就是从buffer里取一定位置的若干字节放到一个结构体内,这会比较麻烦,因为字符串往往不是定长的(你也就会知道为什么很多windows结构体会加一个长度的问题了)。同时,对于基本的查询和搜索,你需要建立索引了,索引的数据相对应的是buffer的位置了,而关键字那就根据需要定了,那么搜索的基本方法首先是确定索引范围,然后做什么折半查找之类的。如果做好的话,需要多个buffer了,若干个索引buffer了。既然内存大小有限制,可以对buffer使用编码等技术进行压缩,以cpu的时间来换取内存的限制了。
对于进程间的通信问题,我觉得还是用socket的好,这中间又会涉及到线程的问题。
要想开始,先把c++、数据结构和高级windows程序的编程弄明白吧!
本来不想再回了,但是很佩服你的学习精神和挑战勇气,假以时日,你会很牛的!
疯石头 2008-10-29
  • 打赏
  • 举报
回复
google上百度一下 ————“ini文件的读写”
雪狼__ 2008-10-14
  • 打赏
  • 举报
回复
你是想把数组保存到数据库,还是以数组的元素作为数据库中的什么?

愚昧,没看明白
bnm77 2008-10-14
  • 打赏
  • 举报
回复

楼上二位可能以为ACCESS和SQLSERVER能覆盖所有的数据库应用,其实不然,在某些对速度要求较高的应用中,这二种数据库都不能卯足要求。有些应用,还要利用API编程来存取数据,而不能用数据库里提供的SQL读取数据...... 跑题了。
还是重复一下我的问题,在VC之下,现在有一个字符数组A[],以这个字符数组为基础,如何建立一个简单的数据库。
jxufeng 2008-10-14
  • 打赏
  • 举报
回复
你赶紧开始写数据库吧,结帖吧
bnm77 2008-10-13
  • 打赏
  • 举报
回复
其实数据库是多种多样的,有大型的也有小型的,根据用途的不同又可以分成基于B+树和不基于B+树的,有时在一个系统里不得不使用多种数据库。当然,在一个简单系统里,可以让一种数据库包打天下,譬如ORACLE。但现在的真实系统应用中,系统几乎都是分布式的,各种层次的功能混在一起,出于成本考虑,我们还必须考虑遗留系统的接口问题。
所以,我觉得,数据库概念的成立完全可以源自一些最简单最基本的要素,这就是基本的数据组织、多进程共享和查询。希望多听大家的意见。
加载更多回复(5)

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧