我必须为已经混乱的系统添加一些功能,我不想让事情变得更糟。这个商店对正确的设计没什么价值,但我这样做是为了寻求妥协。
他们希望添加向数据库中的各种实体添加文件附件的功能,但文件将存储在文件系统中。他们想要附加文件(一对多)的实体是,并且他们希望在数据库中考虑每个附件(指针文件名与root_mount_point是一个动态参数。我将如何保持它同步是我的下一个噩梦。但我'对于客户,帐户,供应商或发票的一对多附件的“许多”表格使用了什么。
create table client {
client_id char(11) not null,
...
}
create table account {
client_id char(11) not null,
account_number char(22) not null,
...
}
create table vendor {
client_id char(11) not null,
account_number char(22) not null,
vendor_number char(15) not null,
...
}
create table invoice {
client_id char(11) not null,
account_number char(22) not null,
vendor_number char(15) not null,
invoice_number char(22) not null,
invoice_date datetime not null (yes this is part of PK)
...
}
当你顺着工作时,每一个都是一对多的。
我正在考虑为“file_attachment”表执行类似的操作,该表可以是四个实体中任意一个的多个表,具体取决于哪些列为null。如果Invoice cols为null,则附件是供应商等。
create table NEW_ENTITY_ATTACHMENT {
attach_id char(11) not null (dummy key, but keeping their char 11 standard),
attach_status_cd char(1) not null, ( "A"ctive or "D"eleted ) ,etc.
attach_status_date datetime not null, (they want complete history, soft deletes, and restores)
client_id char(11) not null,
account_number char(22),
vendor_number char(15),
invoice_number char(22),
invoice_date datetime,
attachment_filename char(blah blah),
..
..
blah
}
因此前三列是必需的,需要client_id,帐户,供应商,发票可选,具体取决于附件的存储级别。
我是否想在这里思考,是否应该为每个实体提供多个表格(例如客户附件,帐户附件,供应商附件,发票附件?如果这是他们不想听到的答案,那么我搞砸了。
我不会问很多问题,但非常感谢任何建议。请记住,这个客户只是希望它完成,他们认为这是一个一到两天的项目,包括数据模型,GUI和后端。如果重要的话,它就是Sybase ASE15。
提前致谢。 [R
答案 0 :(得分:1)
您似乎错过了一些规范化步骤。您应该查看每个子项上引入的列是否唯一标识实体。然后使用父键的外键。供应商通常是一个强大的表,而不是另一个表的孩子。
附件表可能应该是独立表。将可空的attachment_id添加到可能具有附件的每个实体。如果实体可能有多个附件,则使用多对多关系表而不是列。
答案 1 :(得分:1)
考虑到其他表的关键结构,将所有附件放在一个表中是有意义的。例如,您可以通过选择client_id和account_number IS NULL来查询属于客户端(所有级别)的所有附件,只需选择client_id和属于客户端的附件(仅在该级别)。 。
我看到的一个问题是新表的关键:
使用日期作为键的一部分(attach_status_date)会让我感到不舒服(根据您对invoice_date的评论,这显然会让您感到不舒服。)
attach_id是唯一的吗?如果没有,那么即使将attach_status_date作为密钥的一部分,您也可能无法获得唯一密钥。如果它将是唯一的(可能是GUID?)那么将attach_status_date作为键的一部分似乎并不是必需的,特别是因为它看起来不像你将链接到这个字段。也许它应该被编入索引?