我想了解使用Silverlight 4,业务应用程序模板,WCF RIA服务和实体框架4设计CRUD业务应用程序的建议。该应用程序跟踪对材料样本执行的实验室测试结果。它取代了(难以维护的)现有Web应用程序。实验室测试结果存储在由数百个字段组成的两个“SampleData”表中。表格具有一对一的关系。我使用Entity Framework的Table Per Type Inheritance将两个表合并为一个,我非常满意。注意:我决定不更改数据库设计以避免破坏现有应用程序but it was considered.
我的困境是如何打破这张巨大的桌子。每条记录代表一个经过测试的材料样本。字段的逻辑分组是通过实验室测试。我设想我的UI有多个标签或单独的页面 - 每个测试一个。此时的问题是我在所有字段中吮吸但仅在分页的DataGrid中显示一些字段并且存在明显的延迟。有几个“Lab Test”实体(每个代表一种测试类型)是我的一个巨型TPT继承表的子集,而不是一个巨大的实体。我该怎么做?基本SampleData表/实体包含标题字段和几个子测试结果字段。第二个派生表/实体包含通过SampleID链接到基础的更多测试结果字段。如果拆分,我需要维护每个Lab Test实体的头信息。
我愿意坚持使用一个巨大的桌子/实体(尽管有轻微的性能损失)。不过,我想知道用这个实体创建我的UI的最佳方法。 DataForm可以标签化吗?如果我制作一个带有实验室测试链接的仪表板,如何使标题信息与每个测试页保持同步?
我知道这是一个广泛的问题。我希望得到一个良好的设计路径的建议,这将允许我在添加新的实验室测试(增加更大的实体)时增加应用程序。我希望找到一条简化维护的路径,并利用微软正在推广的RAD经验。
提前致谢!
答案 0 :(得分:0)
我扫描了讨论数据库设计的帖子,并且必须根据您的说法以及您已经让用户要求进行更多测试(重复值)这一事实,我希望您重新考虑数据库重新设计。您可以创建一个平面视图来模拟现有的平面样本数据表,并使用它来最大限度地减少现有应用程序中的破损。
但是你已经做出了这个决定,那么如何扭转这种局面呢?不是修复数据库,而是将代码添加到域服务中,该服务从其平面布局转换数据,省略所有空值。
一个想法是编写一个视图,使数据不变平并忽略空的无测试情况。这个查询会引起人们的注意(我可能会因此而受到抨击)因为它看起来很讨厌,但实际上DBMS在优化和执行查询方面做得很好(无论如何都在Oracle中)。我已经有了很好的结果,可以看到类似::
的视图创建视图 programmer_exp_unflat为( 从programmer_exp_flat中选择programmer_id,'C#', csharp_yrs ,其中csharp_yrs不为null 联盟 从programmer_exp_flat中选择programmer_id,'Java', java_yrs ,其中java_yrs不为null 联盟 从programmer_exp_flat中选择programmer_id,'Cobol', cobol_yrs ,其中cobol_yrs不为null 。 从双
重复xx次无论你怎么看,它都是向后和丑陋的,但它会将你的结果集减少到最低限度,而不需要将事情分类。新测试值需要修改视图,并且根据UI灵活性和业务规则,可能不需要任何更改。
它使UI的编码变得更加困难,因为它首先使用正确的数据库设计,但您的查询结果仅减少到已完成的测试。如果您的用户非常灵活,可以将UI设计为将测试结果显示为列表,使显示变得轻而易举。您当前的设计几乎迫使您在每次新测试时修改UI和数据库。
这些是让开发人员变得如此有趣的类型挑战 - 以及为什么所有营销噱头样本CRUD应用程序可以在五分钟内构建,在现实世界中毫无价值。
答案 1 :(得分:0)
我正在回答(并接受)我自己的问题,以提高我的堆栈溢出接受率,但我的“答案”是我还没有找到答案。因为我不得不继续使用该项目,所以我继续使用一个巨大的实体。由于Silverlight的各种困难,例如固有的异步数据访问,我也离开了Silverlight并将项目转变为WPF应用程序。