为现有类添加新特性(c#)
本文关键字:新特性 添加 | 更新日期: 2023-09-27 18:10:55
在c#.net应用程序中,我有如下两个类
员工EmployeeId: int: 主键
名称:string
JobId: int: 主键
名称:string
EmployeeId: int
在数据库(SQL Server)我有两个表来保存这些类的数据(Employee &工作)(ID字段是自动递增字段,所以在两个表中可以有相同的no)
现在我需要实现一个新特性,让用户可以为Employees或Jobs添加评论,因此我需要创建一个Comment类,以便两个类共享。
什么是最好的Class &表结构来实现这个新特性。
您可以创建以下表…
注释(CommentId, Text,[其他字段…])
JobComments (CommentId, JobId)
EmployeeComments (CommentId, EmployeeId)
. .然后,您可以使用每个类型继承的表(如果使用EF,请参阅此处),也可以使用标准关系。
我推荐这样的数据库设计,允许将来添加更多的注释类型,而不需要修改数据库。
表评论Id (int, Primary Key)
CommenteeId (int, not null)
CommentTypeId (int, not null)
Text (nvarchar(255))
表CommentType Id (int, Primary Key)
Name (nvarchar(50), not null)
CommenteeId
将引用Job
或Employee
或将来需要注释的任何其他表。
CommentTypeId
将引用CommentType
,您可以根据需要添加类型。
至于你的类设计,它可能看起来像这样:
public class Job
{
public List<Comment> Comments;
public string Name { get; set; }
}
public class Employee
{
public List<Comment> Comments;
public string Name { get; set; }
}
…作为一个基本概念。如何以及何时将Comment
作为Employee
或Job
的一部分加载取决于您访问数据库的方法。
如果工作和雇员的评论没有区别,我建议接下来:
-
添加Table "Comment"。我不确定你的业务逻辑,但它会有下一个字段,我想:CommentdId, UserId, IsJobComment(这将是位值,将显示作业或员工的评论之间的差异),IsEmployeeComment(将显示这是否是员工的评论),Text, RelatedItemID(这将包含相关作业或员工的id)
-
类结构:将List添加到Job和Employee类
-
添加对象注释值:ID, UserID, Text
不添加IsEmployeeComment和IsJobComment,而是将其更改为简单的列CommentTypeID。
然后添加Table CommentsType,它将包含next字段:1.CommentTypeID2.CommentType -定义类型的字符串值:Employee或Job。因此,当添加新的注释类型时:只需向该字段添加值。
在数据库方面,我不希望每种类型的注释都需要单独的表。
例如Employees和Jobs表可以有一个CommentID列,Comments表可以有如下内容:
CommentID int
RelatedCommentID int
CommentText ntext
那么您将设置RelatedCommentID=CommentID为第一个和所有以下的注释。
最好创建两个表:JobComments和EmployeComments。
两者的内容相同:
注释:int:主键&auto_increment
reference: int:外键
内容:varchar
也许您需要更多的字段,根据您的需要。
我个人会在每个表中添加一个注释列,在每个类中添加字符串变量。
在你的数据库中,如果你想在一个单独的表中有评论,我认为你需要两个单独的表,这对于正在存储的数据来说似乎有点毫无意义。您将需要这两个表,因为如果将Job和Employee的注释保存在一个表中,每个表的id可能会冲突。
在软件中,除了获取/设置值之外,你对注释做了什么,这将保证在单独的类中拥有它?似乎为注释使用额外的类只会使事情过于复杂。
如果您希望保存在一个表中:
Comment:
JobCommented : int <- references a job
EmployeeCommented : int <- references an employee
Comment : string
jobcomments和employeecomded都可以为空。无论哪个被填充,都连接到父节点。
我将创建一个注释表
commentId NUMBER;
commentText VARCHAR2;
和两个关系表:
EmployeeComments
commentId NUMBER;
employeeId NUMBER;
和JobsComments
commentId NUMBER;
jobId NUMBER;
然后选择带有内连接的注释。
这应该至少尊重前三种形式的db规范化。
PS:当然会有一些外键,只是为了确保不要忘记孤立的注释。
对于c#中的对象,只需用左连接表读取
我可能会创建一个单独的类Comments
,并在每个现有的类中有一个List
。如果有任何变化,那么你总是可以子类化为JobComments和EmployeeComments。
对于数据库,我可能实际上将两个表分开。部分原因是我认为,在担心身份问题方面,这样做可能会更容易。如果它们彼此在同一个表中,那么您需要担心ParentTable和ParentId或类似的复合键。
另外,如果两种注释类型有分歧,那么将它们放在数据库的单独表中会容易得多。