为现有类添加新特性(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 &表结构来实现这个新特性。

为现有类添加新特性(c#)

您可以创建以下表…

注释(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将引用JobEmployee或将来需要注释的任何其他表。

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作为EmployeeJob的一部分加载取决于您访问数据库的方法。

如果工作和雇员的评论没有区别,我建议接下来:

  1. 添加Table "Comment"。我不确定你的业务逻辑,但它会有下一个字段,我想:CommentdId, UserId, IsJobComment(这将是位值,将显示作业或员工的评论之间的差异),IsEmployeeComment(将显示这是否是员工的评论),Text, RelatedItemID(这将包含相关作业或员工的id)

  2. 类结构:将List添加到Job和Employee类

  3. 添加对象注释值: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或类似的复合键。

另外,如果两种注释类型有分歧,那么将它们放在数据库的单独表中会容易得多。