数据库设计 - 建议 - 你会怎么做?

时间:2011-03-21 22:03:45

标签: database database-design relational-database normalization sybase-ase

我必须为已经混乱的系统添加一些功能,我不想让事情变得更糟。这个商店对正确的设计没什么价值,但我这样做是为了寻求妥协。

他们希望添加向数据库中的各种实体添加文件附件的功能,但文件将存储在文件系统中。他们想要附加文件(一对多)的实体是,并且他们希望在数据库中考虑每个附件(指针文件名与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

2 个答案:

答案 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作为键的一部分似乎并不是必需的,特别是因为它看起来不像你将链接到这个字段。也许它应该被编入索引?