您的设计看起来不错。系统投入生产后,我总是喜欢在设计阶段多花点时间重新组织数据。您事先不知道管理/销售/财务人员会要求什么样的报告,适当的关系设计会给您更多的自由。
此外,您的性能问题不能只归咎于几个额外的JOIN
。你应该总是看:
- 数据卷(和物理数据布局),
- 交易量和密度,
- I/O,CPU,内存使用情况,
- 您的RDBMS的配置,
- SQL查询质量。
在我看来,JOIN
s将在此列表的底部。
至于RI constraints(参照完整性),我见过一些没有任何主键/外键的项目以提高性能。主要借口是:我们已将所有检查嵌入应用程序和应用程序是系统中任何更改的唯一来源。另一方面,他们同意,不知道系统是否处于一致状态(事实上,分析表明他们不是)。
我总是坚持在设计状态上创建所有可能的键/约束,因为总会有一些“牛仔”在身边,他们会挖掘数据库并“调整”他们看起来更合适的数据。但是,您可能需要暂时禁用或删除批量数据操作的一些约束/索引,这也是official recommendation。
如果不确定,请创建2个测试数据库,其中一个测试数据库与另一个没有限制。加载一些数据并比较查询性能。我认为它会相似。
在这里,我对你的草图的评论,决定都是你的。
为什么我喜欢在命名单数形式表?因为我总是使用table
_id模式命名PK,并且IMHO pharmacy_id
看起来好于pharmacies_id
。我使用这种方法,因为在将数据加载到主表之前执行数据一致性检查时,我有许多通用脚本依赖于此模式。
编辑: 更多关于联系人。 您可以在所有表格中使用contact_id
,使其成为主要联系人,无论这在您的应用程序中可能意味着什么。如果您需要更多联系人以便进行某些关系,则可以使用不同的前缀,如owner_contact_id
,sales_contact_id
等。
如果你指望一个巨大的联系人的数量是有一些关系,如pharmacygroup
,那么你就可以添加额外的表是这样的:
CREATE TABLE pharmacygroupcontact (
contactid int4,
groupid int4,
contact_desc text
);
这部分复制了你的初始groupcontacts
,但由两个FK和一个描述。 哪种方法更好我不知道,因为我不知道如何设计应用程序。
您的列宽可能太窄。意见建议:姓氏= 35,名字= 35,电子邮件= 255 – onedaywhen 2012-04-11 07:27:52