【问题标题】:Database Design - Advice - How would you do it?数据库设计 - 建议 - 你会怎么做?
【发布时间】:2011-07-20 01:12:43
【问题描述】:

我必须为一个已经很乱的系统添加一些功能,我不想让事情变得更糟。这家商店不太重视适当的设计,但我这样做是为了寻求妥协。

他们希望添加向数据库中的各种实体添加文件附件的功能,但文件将存储在文件系统中。他们想要附加文件的实体(一对多)是,他们希望在数据库中考虑每个附件(指针文件名,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”表做这样的事情,该表可以是四个实体中的任何一个的多个表,具体取决于哪些列是空的。如果 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。

提前致谢。 回复

【问题讨论】:

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


    【解决方案1】:

    鉴于其他表格的关键结构,将所有附件放在一个表格中是有意义的。例如,您可以通过仅选择 client_id 来查询属于客户端(在所有级别)的所有附件,并通过选择 client_id 和 account_number IS NULL 来查询属于客户端(仅在该级别)的附件.

    我看到的一个问题是您的新表的关键:
    使用日期作为键 (attach_status_date) 的一部分让我感到不舒服(根据您对 invoice_date 的评论,这显然也让您感到不舒服)。

    attach_id 是唯一的吗?如果没有,那么即使将 attach_status_date 作为密钥的一部分,您也可能无法获得唯一密钥。如果它是唯一的(可能是 GUID?),那么将 attach_status_date 作为键的一部分似乎没有必要,特别是因为它看起来不像您将链接到该字段。也许它应该被索引?

    【讨论】:

    • TYVM - 我认为我们在同一页面上考虑,并且授予这不是我认为它会工作的最佳解决方案。我认为我应该将 attachment_id 设为虚拟 id 和表的整个主键。我可能在 Client_id 上有一个重复的索引。感谢您的意见。
    • 我之所以授予这个问题,是因为我相信它更适合我已经处于的糟糕起始位置,并且回答者显然花时间了解围绕问题的上下文,这意味着很多对我来说。我现在对 BillThor 的回答确实有不同的看法,我认为我可能一直忽略了这一点,因为在我工作的地方很多到很多表都非常罕见,这可能是因为它们的工作量更大。工作竞争如此激烈,唯一重要的是满足短期期限。太糟糕了。谢谢大家。
    【解决方案2】:

    您似乎错过了一些标准化步骤。您应该查看在每个子项上引入的列是否唯一标识实体。然后使用父级的外键。 Vendor 通常是一个强表,而不是另一个表的子表。

    附件表应该是独立表。为每个可能有附件的实体添加一个可为空的 attachment_id。如果实体可能有多个附件,则使用多对多关系表而不是列。

    【讨论】:

    • 我也明白你的意思了。我建议制作一个附件表作为客户、发票等的标识部分,但绝对不是这种情况。我同意供应商;这部分设计已经投入生产很长时间了。我正在开发一个设计非常糟糕的数据库,最后一次尝试做正确的事情时,我意识到这不是在这家公司保住工作的方式。到目前为止,我已经向上箭头了两个答案,它们都很有帮助。 TYVM。
    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多