gpt4 book ai didi

c# - 在应用程序设计方面需要帮助

转载 作者:行者123 更新时间:2023-11-30 14:41:07 26 4
gpt4 key购买 nike

因此,我希望获得有关针对以下情况设计类和存储数据的最佳方式的反馈:

我有一个名为 Tasks 的界面,如下所示:

interface ITask
{
int ID{ get; set;}
string Title {get; set;}
string Description{get; set;}
}

我希望能够根据应用程序的使用者创建不同类型的任务...例如:

public class SoftwareTask: ITask
{
//ITask Implementation
string BuildVersion {get; set;}
bool IsBug {get; set;}

}

public class SalesTask: ITask
{
//ITask Implementation
int AccountID {get; set;}
int SalesPersonID {get; set;}
}

所以我看到它的方式我可以在数据库中创建一个任务表,其中包含与 ITask 接口(interface)匹配的列和一个将更具体任务的所有属性推送到单个列中的列(或者甚至可能序列化任务对象成单列)

为每个任务类型创建一个表来存储该类型特有的属性。

我现在真的不喜欢任何一种解决方案。我需要能够创建不同类型的任务(或任何其他类),它们都通过基本接口(interface)共享一组通用的核心属性和方法,但能够以易于搜索的方式存储它们的独特属性并进行过滤,而无需为每种类型创建一堆数据库表。

我已经开始研究插件架构和策略模式,但我看不出哪里可以解决我存储和访问数据的问题。

非常感谢任何朝着正确方向提供的帮助或插入!!!

最佳答案

您的第二种方法(每种类型一个表)是解决此问题的规范方法 - 虽然它需要更多的努力来实现它更适合大多数数据库的关系模型并保留数据的一致和内聚表示。每个具体类型使用一个表的方法效果很好,并且与大多数 ORM 库(如 EntityFramework 和 NHibernate)兼容。

但是,当子类型的数量非常大,或者子类型是动态创建时,有时会使用一些替代方法。

备选方案 #1:键值扩展表。这是一个表,每个附加字段一行,您希望存储数据,一个外键返回核心表(任务),和一个指定这是什么类型的字段的列。它的结构通常类似于:

TaskExt Table
=================
TaskID : Number (foreign key back to Task)
FieldType : Number or String (this would be AccountID, SalesPersonID, etc)
FieldValue : String (this would be the value of the associated field)

备选方案 #2:类型映射扩展表。在此备选方案中,您创建一个表,其中包含一堆不同数据类型(数字、字符串、日期/时间等)的可为空的列名称如 DATA01、DATA02、DATA03 ... 等等。对于每种任务,您选择列的子集并将它们映射到特定字段。因此,DATA01 可能最终成为 SoftwareTask 的 BuildVersion 和 SalesTask 的 AccountName。在这种方法中,您必须在某处管理一些元数据,以控制将特定字段映射到哪一列。类型映射表通常类似于:

TaskExt Table
=================
TaskID : Number (foreign key back to task)
Data01 : String
Data02 : String
Data03 : String
Data04 : String
Data05 : Number
Data06 : Number
Data07 : Number
Data08 : Number
Data09 : Date
Data10 : Date
Data11 : Date
Data12 : Date
// etc...

选项 #1 的主要好处是您可以根据需要动态添加任意数量的不同字段,甚至可以支持一定程度的向后兼容性。然而,一个显着的缺点是,即使是简单的查询也会变得具有挑战性,因为对象的字段被转换为表中的行。事实证明,逆透视是一项既复杂又通常性能不佳的操作。

选项 #2 的好处是它易于实现,并保留行之间的 1 对 1 对应关系,使查询变得容易。不幸的是,这也有一些缺点。首先是列名完全没有信息,您必须引用一些元数据字典才能了解哪些列映射到哪种类型的任务的哪个字段。第二个缺点是大多数数据库将表上的列数限制为相对较小的数字(通常为 50 - 300 列)。因此,您只能使用这么多数字、字符串、日期时间等列。因此,如果您键入的 DateTime 字段最终超过表支持的数量,则您必须使用字符串字段来存储日期,或者创建多个扩展表。

预先警告,大多数 ORM 库不为这两种建模模式提供内置支持。

关于c# - 在应用程序设计方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com