通常我会将SQL / SQLite / Mongo用于任何数据库-y但我认为尝试创建自己的平面文件数据库结构会很有趣(它只是一个学习项目)。应用程序本身是一个音乐流,在服务器上有一个集中的库。
我的应用程序是客户端/服务器,其中服务器所做的任何更改都会同步到所有客户端。服务器确实插入,编辑和删除操作。
客户端只能更改记录中的客户端修饰符布尔字段(其值特定于该客户端)。没有其他操作可供客户端使用,因此无需更改即可同步。
在初始数据库构建之后,服务器上的写操作很少,但确实发生了。这里的优先级肯定是客户端的读操作。
需要可扩展至500k +轨道或2GB(2 ^ 31字节)数据库文件大小(始终是第一位)。
+--------+ +--------+ +-------------------+ | id* | | id* | | id* | | ARTIST | ------> | ARTIST | | track name | | | | ALBUM | ------> | ALBUM | | | | year | | length | | | | | | filename** | | | | | | {client modifier} | +--------+ +--------+ +-------------------+ * unique identifier ** not stored in client version of database {client modifier} is only on the client version of database
必须克服的一个问题是如何处理关系并寻求最小化I / O操作。
解决此问题的一种方法是存储上次修改每条记录的日期/时间,并让客户端存储上次同步的日期。当客户端联机时,所有更改都会将该日期同步回客户端。另一种方法是在服务器上有一个单独的表,列出已发生的所有操作及其发生的日期;并以类似的方式同步。
由于表格较小,客户可以将艺术家,专辑表存储在内存中,但我会假设他们不会这样做。
我想要做的是为每个表分别创建文件,客户端始终打开每个文件以确保他们能够尽快阅读...这是个坏主意吗?
必须为每个表存储某种索引,以便每条记录的起始位置。这可能足够小,可以加载到内存中,并且可以存储在与实际表分开的文件中,以避免出现问题。
服务器将使用id和文件名在内存中存储track数据库的“索引”,以便将读取操作保持在最低限度。
服务器还将缓冲数据库写操作,这样如果它检测到很多写操作将在很短的时间内发生,它将等待然后进行批量写操作。这是可能的,因为对文件系统的更改仍然是数据库崩溃,因此它可以在重新启动时重新加载所有更改。
我将在字节级别工作以减小文件大小。删除记录时,主要问题是碎片。由于可变长度字段,您不能简单地在该位置添加新记录
当文件达到某个碎片级别(已删除的记录与记录的比率)时,我可以对文件进行解密,但我宁愿避免这种情况,因为这对于客户来说这将是一项昂贵的操作。
我宁愿不使用固定长度的字段(例如文件名可能很大),但这些只在选项中出现?
那么我该如何解决这个问题并最大限度地提高绩效呢?
是的,我正在寻找重新发明的轮子,是的,我知道我可能不会接近其他数据库的表现。
那么有没有人有任何想法/意见/见解?
感谢阅读。
答案 0 :(得分:1)
我的建议是设计和构建您的数据库。不要担心性能。首先担心可靠性。
一次完成一项功能:
Sever能够以最少的操作将数据库同步到所有客户端。
这需要记录数据库更改。你有正确的想法。
客户端的快速读取操作
在现代PC上,您可以足够快地阅读平面文件。每个表的单独平面文件是一个很好的设计。如果平面文件足够小(域表),您可以读取它们一次并将表保留在内存中。在数据库关闭时,您将编写一次表。
最小化I / O操作
数据库通过读写数据块来最小化I / O操作。我马上就不会太在意这件事了。您的数据库需要可靠。
非稀疏文件,以将文件大小保持在最低
大多数现代PC都有足够的磁盘空间,这是另一个功能,可以推迟到以后。数据库重组通常受DBA控制,因为它是一个非常昂贵的过程。
祝你好运。答案 1 :(得分:0)
这是几年前我不完整的项目。我无法解释它,它已经过时了,但它已经过时了。值得尝试(我实际上并没有这样做)。它在第一印象中完全是一个杂乱无章的数据库(平面文件),但在我的理论中,它并不是最糟糕的情况。任何人都可以添加概念或改进,例如加密,速度增强,数据绑定,数据格式化等。
按结构,数据被分类到文件夹,文件等。我还认为每次执行查询时关闭文件连接都会节省内存。
请与我交谈,这是几年前提出的,所以我仍然使用ASP。现在,我正在使用Ruby-on-Rails和NodeJS(以及一些PHP)
我称之为概念文件夹 - 文件数据委托,该数据按文件夹和文件结构化为层次结构,数据库中的最小结构称为原子。
文件夹 - 文件数据委派的5个主要目标
结构
Database/
Table1/
Fieldsinfo/
username.mapper (file to provide info about the username field)
password.mapper (file to provide info about the password field)
Records/
username/
recordid1.tabledata (file that contains the data/value)
recordid2.tabledata (file that contains the data/value)
password/
recordid1.tabledata (file that contains the data/value)
recordid2.tabledata (file that contains the data/value)
…