I am working on a project that has file path fields that are either a "one to one" relationship (Invoice object has only a single file is allowed) or "one to many" relationship (a Claim object has many files that can be added to it).
I currently have two ideas.
1) One Database for All Files
I have a [Claim] Database
Claim (PK) --- Name --- Address
1 Joe Some Place
I have an [Invoice] Database
Invoice (PK) --- Vendor --- FilePathID
100 12 1
And an [Attachments] Database
UID (PK) --- Claim --- Description --- FilePath
1 NULL Invoice path\to\invoice
2 1 Receipt path\to\receipt
3 1 Image path\to\image
This would work in the following way:
The [Invoice] file would be explicitly defined ([Attachment] ID 1 in this case) in the [Invoice] object. Then files would be attached to the [Claim] object by a linking number (Claim 1 in the case above) in the "Attachments" database. This way we can do a query to list all attachments for [Claim] one, but at the same time keep the [Invoice] file in the same [Attachments] database linked by the UID number for the file. This allows all uploads to be mapped in a single database.
My only concern with this method is that on the file that is uploaded for an [Invoice] the Claim field is left to NULL.
2) File Paths Are Stored In Multiple Databases
This is almost identical to the above example but instead of linking the FilePath in the [Attachments] database it is defined directly in the [Invoices] database. Like this:
I have a [Claim] Database
Claim (PK) --- Name --- Address
1 Joe Some Place
I have an [Invoice] Database
Invoice (PK) --- Vendor --- FilePath
100 12 path\to\invoice
And an [Attachments] Database
UID (PK) --- Claim --- Description --- FilePath
1 1 Receipt path\to\receipt
2 1 Image path\to\image
This method allows for the Claim field in the [Attachments] database to never be NULL, but it separates the area where the [Attachments] FilePath is found.
I am very torn between the two methods at this point. Is there a preferred method or best practice to do this or is it really just what one feels comfortable doing?
We are having to do this for at least 4 objects. Not just two.
Thanks very much in advance and any help is very much appreciated,
Brandon
If i where facing the problem, I would have a base table called Document
for all document-like entities, having shared properties of all documents.
Having this base table, Attachment
table will have a one-to-many
relation to Document
table.
Other document-like entities such as Invoice
or Claim
will have a one-to-one
relation to the Document table.
Not sure this is "best practice", but here's an Option 3:
[Claim] table:
ClaimID (PK) --- Name --- Address
1 Joe Some Place
[Invoice] table:
InvoiceID (PK) --- Vendor
100 12
[Attachment] table:
AttachmentID (PK) --- Description --- FilePath
1 Invoice path\to\invoice
2 Receipt path\to\receipt
3 Image path\to\image
[ClaimAttachment] table:
ClaimID (FK) --- AttachmentID (FK)
1 2
1 3
[InvoiceAttachment] table:
InvoiceID (FK) --- AttachmentID (FK)
100 1
If you need the database to enforce that an invoice may only have one attachment, put a unique constraint on the Invoice column in the InvoiceAttachment table.
Alternatively if you want to only have one table to handle the attachment relationships, you could do something like this:
[AttachmentRlshp] table:
AttachmentID (FK) --- EntityID --- EntityType
1 100 Invoice
2 1 Claim
3 1 Claim
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With