长期读者,第一次发表海报......
我正在尝试为备份应用程序提出数据库设计。我以前曾经和SQLite讨论过一点,但我不是一个专业的程序员。 所以我想知道我的数据库设计是否有任何意义......
我的应用程序(用Xojo编写)基本上是一个备份应用程序,备份它可以找到的所有磁盘,但用户明确排除的磁盘除外。
在(SQLite)数据库中,我必须跟踪所有磁盘及其某些属性。 所以我有一个表盘:
CREATE TABLE Disks (
id INTEGER NOT NULL UNIQUE,
Name TEXT NOT NULL,
DiskType INTEGER NOT NULL,
NameTag TEXT NOT NULL,
LastSeen TEXT,
PRIMARY KEY ( id ),
FOREIGN KEY ( DiskType ) REFERENCES DiskTypes( id ) ) ;
DiskType描述它是本地卷还是网络卷(必须通过脚本挂载)。
CREATE TABLE DiskTypes (
id INTEGER NOT NULL UNIQUE,
DiskType TEXT NOT NULL,
PRIMARY KEY ( id ) ) ;
INSERT INTO DiskTypes ( id, DiskType ) VALUES ( 1, 'Network' );
INSERT INTO DiskTypes ( id, DiskType ) VALUES ( 2, 'Local' );
现在是“棘手”的部分。
将向用户显示已连接到该计算机的所有卷的列表 - 存储在“磁盘”表中。
然后他可以将任何磁盘的状态更改为“备份源”,“备份目标”和“排除”
可以有多个状态的“备份目标”,用户可以选择将哪个“备份源”备份到“备份目标”。
(基本上Disk1备份到Disk80,Disk2备份到Disk81,Disk3再次备份到Disk80,依此类推。)
所以我为可能的“使用”创建了一个表。
CREATE TABLE UseTypes (
id INTEGER NOT NULL UNIQUE,
UseType TEXT NOT NULL,
PRIMARY KEY ( id ) ) ;
INSERT INTO UseTypes ( id, UseType ) VALUES ( 1, 'Source' );
INSERT INTO UseTypes ( id, UseType ) VALUES ( 2, 'Destination' );
INSERT INTO UseTypes ( id, UseType ) VALUES ( 3, 'Excluded' );
这是我的表格方法,其中包含磁盘与其预期用途之间关系的信息:
CREATE TABLE DiskUse (
id INTEGER NOT NULL UNIQUE,
DiskID INTEGER NOT NULL UNIQUE,
UseID INTEGER NOT NULL,
LastBackup TEXT,
BackupToDiskID INTEGER,
PRIMARY KEY ( id ),
FOREIGN KEY ( DiskID ) REFERENCES Disks( id ),
FOREIGN KEY ( UseID ) REFERENCES UseTypes( id ),
FOREIGN KEY ( BackupToDiskID ) REFERENCES Disks( id ),
CHECK (
( UseID = 1 and BackupToDiskID <> DiskID )
or ( LastBackup = NULL and BackupToDiskID = NULL ) ) ) ;
我的问题是:
- 在这个大的DiskUse表中跟踪磁盘使用情况是否有意义? (如果磁盘是备份源(UseID = 1),则只需要“LastBackup”和“BackupToDiskID”列,我必须检查所选的备份目标是否实际上是已设置为“BackupDestination”的磁盘“......)
- 或者更有意义的是有3个表DisksSource,DisksDestination和DisksExcluded并在它们之间移动磁盘? (这种设计允许重复,这没有意义......)
- 或者有没有我想到的第三种选择?也许我在这里想得太复杂了?
感谢任何帮助!
答案 0 :(得分:1)
总的来说,这对我来说很有意义。但是,将UseID移动到Disks表可能更好。这样,您就不必在DiskUse表上为Destination和Excluded磁盘创建任何记录。你将从当前模式中解放出来的只是DiskUse表上的check语句,如果取决于你如何进行插入,它本身可能会有问题。如果必须存在此检查,您可以将其更改为;
CHECK ((BackupToDiskID <> DiskID )
or ( LastBackup = NULL and BackupToDiskID = NULL ) ) ) ;
这仍然会给你一些实用性。