我正在开发一个项目,其文件路径字段是“一对一”关系(Invoice对象只允许一个文件)或“一对多”关系(一个Claim对象有很多文件,可以添加到它)。
我目前有两个想法。
1)所有文件的一个数据库
我有一个[Claim]数据库
Claim (PK) --- Name --- Address
1 Joe Some Place
我有[发票]数据库
Invoice (PK) --- Vendor --- FilePathID
100 12 1
和[附件]数据库
UID (PK) --- Claim --- Description --- FilePath
1 NULL Invoice path\to\invoice
2 1 Receipt path\to\receipt
3 1 Image path\to\image
这可以通过以下方式工作:
[Invoice]文件将在[Invoice]对象中明确定义(在本例中为[Attachment] ID 1)。然后,文件将通过“附件”数据库中的链接号(上面的情况中的权利要求1)附加到[Claim]对象。这样我们就可以查询列出[Claim] one的所有附件,但同时将[Invoice]文件保存在由文件的UID编号链接的相同[Attachments]数据库中。这允许将所有上载映射到单个数据库中。
我唯一担心的是,在为[Invoice]上传的文件中,Claim字段为NULL。
2)文件路径存储在多个数据库中
这几乎与上面的示例相同,但它不是在[Attachments]数据库中链接FilePath,而是直接在[Invoices]数据库中定义。像这样:
我有一个[Claim]数据库
Claim (PK) --- Name --- Address
1 Joe Some Place
我有[发票]数据库
Invoice (PK) --- Vendor --- FilePath
100 12 path\to\invoice
和[附件]数据库
UID (PK) --- Claim --- Description --- FilePath
1 1 Receipt path\to\receipt
2 1 Image path\to\image
此方法允许[Attachments]数据库中的Claim字段永远不为NULL,但它会分隔找到[Attachments] FilePath的区域。
此时我对这两种方法非常不满。有没有一种首选的方法或最佳做法来做到这一点,还是真正让人觉得舒服的事情呢?
我们必须为至少4个对象执行此操作。不只是两个。
非常感谢,非常感谢任何帮助,
布兰登
答案 0 :(得分:3)
如果我遇到问题,我会为所有类似文档的实体提供一个名为Document
的基表,它具有所有文档的共享属性。
拥有此基表后,Attachment
表将与one-to-many
表格具有Document
关系
其他类似文档的实体(例如Invoice
或Claim
)与Document表格具有one-to-one
关系。
答案 1 :(得分:1)
不确定这是“最佳做法”,但这是选项3:
[索赔]表:
ClaimID (PK) --- Name --- Address
1 Joe Some Place
[发票]表:
InvoiceID (PK) --- Vendor
100 12
[附件]表:
AttachmentID (PK) --- Description --- FilePath
1 Invoice path\to\invoice
2 Receipt path\to\receipt
3 Image path\to\image
[ClaimAttachment]表:
ClaimID (FK) --- AttachmentID (FK)
1 2
1 3
[InvoiceAttachment]表:
InvoiceID (FK) --- AttachmentID (FK)
100 1
如果您需要数据库强制发票可能只有一个附件,请在InvoiceAttachment表中的Invoice列上添加唯一约束。
或者,如果您只想有一个表来处理附件关系,您可以这样做:
[AttachmentRlshp]表:
AttachmentID (FK) --- EntityID --- EntityType
1 100 Invoice
2 1 Claim
3 1 Claim