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

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

发布于 2012-04-11 13:49:28
你的设计在我看来很不错。我总是更喜欢在设计步骤上有几个额外的联接,而不是在系统投入生产后花费时间重新组织数据。你永远不会提前知道管理人员/销售人员/财务人员会要求什么样的报告,而适当的关系设计会给你更多的自由。
此外,您不能只将性能问题归咎于几个额外的JOIN。您应该始终查看以下内容:
在我看来,JOINs将在这个列表的底部。
至于RI constraints (引用完整性),我已经看到几个项目在没有任何主键/外键的情况下运行,以提高性能。主要的借口是:我们已经将所有检查嵌入到应用程序中,并且应用程序是系统中任何更改的唯一来源。另一方面,他们一致认为,目前还不知道系统是否处于一致的状态(实际上,分析表明它们不是)。
我总是坚持在设计状态上创建所有可能的键/约束,因为总会有一些“牛仔”在身边,他们会深入你的数据库并“调整”他们看起来更适合的数据。不过,您可能希望暂时禁用甚至删除批量数据操作的一些约束/索引,这也是一个official recommendation。
如果不确定,创建2个测试数据库,一个有约束,另一个没有约束。加载一些数据并比较查询性能。我认为这将是相似的。
这是我对你的草图的评论,决定权在你手中。
addresses一样创建一个通用的contacts表,例如,将contact_id、owner_contact_id等列添加到目标关系中,而不是从contacts表中引用关系;contacttype表中只有一列(并且如果您将有一个公共的contacts),最好将唯一的字段移开并避免使用此表;pharmacygroup中你的PK被命名为id,而所有的rest PK都遵循tableid模式,如果你在这里使用一个通用的模式,以后编写脚本会更容易;addresses表中你有带下划线的字段,比如street_name,而在其他地方你避免了<>d38>-考虑让它命名不同。尽管它不是很重要,但我确实有几个系统必须依赖约束的名称,所以在这里最好使用一些模式。我使用以下代码:
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_id,sales_contact_id等。
如果您希望有大量的联系人存在于某些关系,如pharmacygroup,那么您可以添加一个额外的表,如下所示:
CREATE TABLE pharmacygroupcontact (
contactid int4,
groupid int4,
contact_desc text
);它部分复制了您的初始groupcontacts,但包含两个FK和一个描述。我不知道哪种方法更好,因为我不知道应用程序是如何设计的。
发布于 2012-04-11 12:29:05
你有2个联系人表,我会创建一个,然后使用链接表来链接组联系人和药剂组联系人。我肯定希望将FK和PK关系设置为。
https://stackoverflow.com/questions/10099684
复制相似问题