首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计评论家/suggestions

数据库设计评论家/suggestions
EN

Stack Overflow用户
提问于 2012-04-11 12:11:41
回答 2查看 1.4K关注 0票数 2

我正在重新设计一个药房数据库系统,需要输入信息来看看新的设计是最优的还是需要调整的。

这是旧系统的快照..

可以看出,药房表存储药房信息及其地址和联系信息。药房分组的目的是为了开具发票(药品组),或者是为了销售,宣传其他目的(标语组)。发票组可以具有不同的物理地址、不同的联系信息。

这是我的新设计。我已经将来自药房和药房组表的地址拆分到一个单独的表中,并为联系人创建了一个新表。它们可以是技术联系人、帐户联系人、所有者联系人等,因此是contacttype表。药房和药房组可以有单独的联系信息,我想做一个单独的联系人表,并有一个'linktype‘和'linkid’列来表明它是药房联系人还是药房组联系人,但我不确定这是不是一个正确的方法。这是一个好的设计,还是会因为连接的数量而在数据检索方面代价高昂??我注意到的另一件事是,在旧的设计中,他们没有创建任何外键约束,尽管pharmacy表有针对药剂组和bannergroup的groupid和bannergroupid引用,这可能是为了节省数据检索时间。这是一种好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 13:49:28

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

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

  • 数据卷(和物理数据布局)、
  • 事务数量和密度、
  • I/O、CPU、内存使用率、
  • 您的关系型数据库配置、
  • SQL查询质量。

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

至于RI constraints (引用完整性),我已经看到几个项目在没有任何主键/外键的情况下运行,以提高性能。主要的借口是:我们已经将所有检查嵌入到应用程序中,并且应用程序是系统中任何更改的唯一来源。另一方面,他们一致认为,目前还不知道系统是否处于一致的状态(实际上,分析表明它们不是)。

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

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

这是我对你的草图的评论,决定权在你手中。

  • 您可能想要像创建addresses一样创建一个通用的contacts表,例如,将contact_idowner_contact_id等列添加到目标关系中,而不是从contacts表中引用关系;
  • 由于您在contacttype表中只有一列(并且如果您将有一个公共的contacts),最好将唯一的字段移开并避免使用此表;
  • 您的表似乎有单数/复数名称的混合,最好在此处遵循通用模式。我个人更喜欢单数;
  • pharmacygroup中你的PK被命名为id,而所有的rest PK都遵循tableid模式,如果你在这里使用一个通用的模式,以后编写脚本会更容易;
  • addresses表中你有带下划线的字段,比如street_name,而在其他地方你避免了<

>d38>-考虑让它命名不同。尽管它不是很重要,但我确实有几个系统必须依赖约束的名称,所以在这里最好使用一些模式。我使用以下代码:

代码语言:javascript
复制
1. prefix `p_`, `f_`, `c_`, `t_`,  `u_` or `i_` for primary, foreign keys, check constraints, triggers, unique and other indexes;
2. name of the table;
3. name of the column constraint/index/trigger refers to.

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

联系人编辑: More on contacts。您可以在所有表中使用contact_id,使其成为主要联系人,无论这在您的应用程序中意味着什么。如果你需要更多的联系人来处理一些关系,那么你可以使用不同的前缀,比如owner_contact_idsales_contact_id等。

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

代码语言:javascript
复制
CREATE TABLE pharmacygroupcontact (
    contactid     int4,
    groupid       int4,
    contact_desc  text
);

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-11 12:29:05

你有2个联系人表,我会创建一个,然后使用链接表来链接组联系人和药剂组联系人。我肯定希望将FK和PK关系设置为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10099684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档