2

我正在重新设计一个药房数据库系统,需要输入以查看新设计是否最佳或需要调整。

这是旧系统的快照..

药房 Db 旧

可以看出,药房表存储药房信息,连同其地址和联系信息。药房为了开票目的(pharmacygroup)或为了销售、广告其他目的(banner group)而组合在一起。发票组可能有不同的实际地址、不同的联系信息。

这是我的新设计。我已将 pharmacy 和 pharmacygroup 表中的地址拆分为自己的表,并为联系人创建了一个新表。他们可能是技术联系人、客户联系人、所有者联系人等,因此是联系人类型表。药房和药房组可以有单独的联系信息,我想制作一个联系表并有一个“链接类型”和“链接ID”列来指示它是药房联系人还是药房组联系人,但我不确定这是否是正确的做法。这是一个好的设计还是会因为连接的数量而在数据检索方面成本高昂?我注意到的另一件事是,在旧设计中,他们没有创建任何外键约束,尽管药房表有药房组和横幅组的 groupid 和 bannergroupid 引用,可能是为了节省数据检索的时间。这是一个好方法吗?

药房数据库设计新

4

2 回答 2

4

你的设计对我来说很好。我总是更喜欢在设计步骤中有几个额外的连接,而不是在系统投入生产后花时间重新组织数据。你永远不知道管理层/销售/财务人员会要求什么样的报告,适当的关系设计会给你更多的自由。

此外,您不能只JOIN将性能问题归咎于几个额外的 s。您应该始终查看:

  • 数据量(和物理数据布局),
  • 交易金额和密度,
  • I/O、CPU、内存使用率、
  • 您的 RDBMS 配置,
  • SQL 查询质量。

在我看来,JOINs 将在这个列表的底部。

至于RI 约束(参照完整性),我已经看到几个项目在没有任何主键/外键的情况下运行以提高性能。主要借口是:我们将所有检查嵌入到应用程序中,而应用程序是系统中任何更改的唯一来源。另一方面,他们同意,目前尚不清楚系统是否处于一致状态(事实上,分析表明并非如此)。

我总是坚持在设计状态上创建所有可能的键/约束,因为总会有一些“牛仔”,他们会挖掘你的数据库并“调整”他们看起来更合适的数据。不过,您可能希望暂时禁用甚至删除一些用于批量数据操作的约束/索引,这也是官方建议

如果不确定,创建 2 个测试数据库,一个有约束,另一个没有约束。加载一些数据并比较查询性能。我认为这将是相似的。

在这里,我对你的草图的评论,决定都是你的。

  • 您可能希望以contacts与 相同的方式创建一个公共表addresses,即向目标关系添加contact_idowner_contact_id等列,而不是从contacts表中引用关系;
  • 由于表中只有一列contacttype(如果您有一个 common contacts),最好将唯一的字段移开并避免使用此表;
  • 您的表格似乎混合了单数/复数名称,最好在这里坚持一个共同的模式。我个人更喜欢单数;
  • pharmacygroup您的 PK 中命名为id,而所有其余 PK 都遵循tableid 模式,如果您在这里使用通用模式,以后编写脚本会更容易;
  • addresses表格中,您有带下划线的字段,例如street_name,而在其他地方则避免使用_- 考虑使其通用;
  • 引用的名称不同。虽然它不是那么重要,但我确实有几个系统必须依赖约束的名称,所以最好在这里使用一些模式。我使用以下一个:

    1. prefix p_, f_, c_, t_, u_ori_用于主键、外键、检查约束、触发器、唯一性和其他索引;
    2. 表名;
    3. 列约束/索引/触发器引用的名称。

为什么我更喜欢以单数形式命名表?table因为我总是使用_id 模式命名 PK ,而恕我直言pharmacy_id看起来更好pharmacies_id。我使用这种方法是因为我有一堆通用脚本,它们在将数据加载到主表之前执行数据一致性检查时依赖于这种模式。

编辑: 有关联系人的更多信息。您可以contact_id在所有表​​格中使用,使其成为主要联系人,无论这在您的应用程序中意味着什么。如果您需要更多联系人来处理某些关系,那么您可以使用不同的前缀,例如owner_contact_id,sales_contact_id等。

如果您希望有大量联系人用于某些关系,例如pharmacygroup,那么您可以添加一个额外的表格,如下所示:

CREATE TABLE pharmacygroupcontact (
    contactid     int4,
    groupid       int4,
    contact_desc  text
);

它部分复制了您的 initial groupcontacts,但包含两个 FK 和一个描述。我不知道哪种方法更好,因为我不知道应用程序是如何设计的。

于 2012-04-11T05:49:27.657 回答
1

您有 2 个联系人表,我会创建一个,然后使用链接表来链接 groupcontacts 和 pharmacycontacts。我肯定希望设置 FK 和 PK 关系。

于 2012-04-11T04:29:05.057 回答