使用类似但不同的模型设计数据库

时间:2015-12-17 21:37:22

标签: database database-design entity-relationship

目前,我的设计工作达到了一定程度,我可能会让它按照我的方式工作得很好,但是我觉得它应该更好,我感到不满意。

基本上,我有一个可以创建文档的系统。完成此操作后,您可以选择要创建的文档类型并显示一个表单。然后将数据添加到表单中,并生成文档。

我在Laravel工作,事情是通过模特完成的。我发现自己为每个文档创建了一个新模型,但我不认为这是最好的方法。这是我的数据库外观的一个小例子 Design of database

所以它的核心是项目。我进入我的系统并创建一个新项目。有了项目,我现在可以为这个项目创建文档。所以说我从选择框中选择项目简介,表格会显示给我,我可以输入

  • 项目角色
  • 项目数据
  • Deliverables
  • 预算

基本上,它有三个文本字段和一个标准输入字段。如果我从选择菜单中选择报告文档,我必须输入此文档的数据,这是一些正常输入,几个文本字段和日期。

因此,虽然它们都是文档,但它们期望不同的数据,这就是我为每个文档创建模型的原因。

问题存在于两个方面。首先,如图所示,我希望允许将支持文档与生成的文档一起上载。我有一个doc_upload表。因此,文档可以有一个或多个doc_uploads。

现在回到MVC结构,在我的DocUpload模型中,我不能说DocUpload属于ProjectBriefDoc和ProjectReportingDoc,因为它只能属于一个Model。所以我的设计目前的方式,不仅是我要为每个文档创建一个新模型,我还必须为每个文档创建一个新的上传模型。

随着更多文件的增加,我可以看到这成为管理的噩梦。

我认为我所追求的是一个更通用的模型,它可以处理不同类型的文档。我的斗争与我需要为每个文档捕获的不同类型的数据有关,以及我如何将其融入我的设计中。

我知道我目前有一个可以运作的设计 - 但有些东西告诉我这是一个坏主意。真的,我只是在寻找关于如何更好地设计这一点的建议,考虑到每个文档需要不同的输入,并且每个文档都需要允许文件上传。

非常感谢

3 个答案:

答案 0 :(得分:1)

确定。

我有一个建议..你不必在doc_upload引用上有这么紧密的耦合。您可以将此实际视为模型中的独立表,而不是与单个实体挂钩。您仍然可以使用ORM来CRUD并管理此表..

我要做的是保留doc_upload表,并将其用于所有文档的所有up_load引用,无论文档所在的表模型是什么,并在doc_upload表中包含以下字段

documenttype(可以是目标文档对象的对象名称)

documentid_fk(现在是相应文档类型表中单行的通用键

所以给定一个给定表中的文档..(你可以根据模型对象派生出文档类型),你知道文档本身的id,因为你只是从db上下文中提取它...应该能够拉doc_upload表中与这两个值匹配的所有相关文档。

您可以在模型中使用反射来了解您所处的实体(文档类型)...而关键只是关键..所以您应该能够。

您仍然需要为您希望拥有的每种项目文档创建一个新的模型实体..但如果变化率很小,这可能不会太困难。

您应该能够编写最少量的代码,以便将所有相关的上传文档提取到您的应用中。

答案 1 :(得分:1)

您可以在数据模型设计中使用零或一关系的继承 IMO有一个名为project-document的抽象实体(表格),包含所有文件的共享属性,将为您服务。

project-briefproject-report以及其他类型的文档将是project-document表的子项,具有零或一关系。 project-document的主键是孩子的外键和主键 现在project-documentdoc-upload之间的一对多关系将解决问题 我还建议在项目文档中添加一个唯一约束{project_id, doc_type}以进行基数检查(如有必要)
enter image description here

答案 2 :(得分:1)

正如其他答案有点暗示,你可能希望为不同的文档设置不同的模型,而是为#34;文档"对您的不同流程有不同的看法。 Laravel似乎有一个很好的"模板"实现意见的系统:

http://laravel.com/docs/5.1/blade

http://daylerees.com/codebright-blade/