数据库设计 - 如何存储和项目达到预定可使用

问题描述:

长期读者,首次海报之间的关系......数据库设计 - 如何存储和项目达到预定可使用

我想拿出一个数据库设计的备份应用程序。之前我曾经使用过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并移动它们之间的磁盘? (这种设计会允许重复,这是没有意义的...)
- 或者还有第三种选择,我没有想到?也许我在这里想的太复杂了?

任何帮助表示赞赏!

总的来说,这对我很有意义。但是,将UseID移动到磁盘表可能会更好。这样您就不必在DiskUse表上为Destination和Excluded磁盘创建任何记录。只有你从当前模式中放弃的东西才是DiskUse表上的检查语句,如果取决于你如何执行插入操作,本身可能会产生问题。如果此检查必须存在,您可以将其更改为;

CHECK ((BackupToDiskID <> DiskID) 
     or (LastBackup = NULL and BackupToDiskID = NULL))) ; 

这仍然会给你一些效用。