在c#.net应用程序中,我有两个类,如下所示
员工
EmployeeId:int:主键
名称:字符串
作业
JobId:int:主键
名称:字符串
EmployeeId:int
在数据库(SQL Server)中,我有两个表来保存这些类中的数据(Employee& Job) (ID字段是自动增量字段,因此在两个表中都可以具有相同的no)
现在我需要实现一个新功能,让用户为Employees或Jobs添加注释,所以我需要创建一个Comment类来共享这两个类。
什么是最好的Class&用于实现此新功能的表结构。
答案 0 :(得分:3)
您可以创建以下表格...
评论(CommentId,Text,[other fields ...])
JobComments(CommentId,JobId)
EmployeeComments(CommentId,EmployeeId)
..然后你可以使用每种类型的继承表(如果使用EF参见here),或者你可以使用标准关系来完成。
答案 1 :(得分:2)
我建议使用数据库设计,以便将来添加更多注释类型,而无需修改数据库。
表评论
Id (int, Primary Key)
CommenteeId (int, not null)
CommentTypeId (int, not null)
Text (nvarchar(255))
表格注释
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
的方式和时间取决于您访问数据库的方法。
答案 2 :(得分:1)
如果职位评论与员工之间没有差异,我会建议下一步:
添加表“评论”。我不确定你的业务逻辑,但我认为它会有下一个filds: CommentdId,UserId,IsJobComment(这将是显示工作或员工的cmmments之间差异的位值),IsEmployeeComment(将显示这是否为Employee的评论),Text,RelatedItemID(这将包含相关工作或员工的ID)
班级结构: 将列表添加到类Job和Employee
使用值添加对象注释:ID,UserID,Text。
更新:还有一个想法。
而不是添加IsEmployeeComment和IsJobComment,而不是将其更改为简单列CommentTypeID。
然后添加Table CommentsType,它将包含下一个字段: 1.CommentTypeID 2.CommentType - 将定义类型的字符串值:Employee或Job。因此,添加新评论类型时:只需为此字段添加值。
答案 3 :(得分:1)
数据库方面我不希望每种类型的评论都需要单独的表。
例如,Employees和Jobs表可以有一个CommentID列,而Comments表可以是这样的:
CommentID int
RelatedCommentID int
CommentText ntext
然后,您将为第一个和所有后续注释设置RelatedCommentID = CommentID。
答案 4 :(得分:0)
为此,最好创建两个表:JobComments和EmployeComments。
两者的内容相同:
CommentId:int:主键&amp; AUTO_INCREMENT
ReferenceId:int:外键
内容:varchar
根据您的需要,您可能需要更多字段。
答案 5 :(得分:0)
我个人只会在每个表中添加一个注释列,并为每个类添加一个字符串变量。
在您的数据库中,如果您想在单独的表中包含注释,我认为您需要两个单独的表,对于正在存储的数据而言似乎毫无意义。您需要这两个表,因为如果您将Job和Employee的注释保留在一个表中,则每个表的ID都会发生冲突。
在软件中你对除了获得/设置值之外的其他评论做了什么?似乎使用额外的类来进行评论只会使事情过于复杂。
答案 6 :(得分:0)
如果您希望保留在一个表格中:
Comment:
JobCommented : int <- references a job
EmployeeCommented : int <- references an employee
Comment : string
JobCommented和EmployeeCommented都可以为空。无论哪个填充都连接到父母。
答案 7 :(得分:0)
我会创建一个评论表
commentId NUMBER;
commentText VARCHAR2;
和两个关系表:
EmployeeComments
commentId NUMBER;
employeeId NUMBER;
和JobsComments
commentId NUMBER;
jobId NUMBER;
然后选择带有内连接的注释。
这应该至少尊重前三种形式的db规范化。
PS:当然有一些外键只是为了确保不要忘记孤立的评论。对于c#中的对象,嗯,只需用左边的连接来连接表格。
答案 8 :(得分:0)
我可能会创建一个类Comments
,并且在每个现有类中都有List
个类。如果有任何变化,那么您可以始终将其子类化为JobComments和EmployeeComments。
对于数据库,我可能实际上将两个表分开。这部分是因为我认为在担心身份方面这样做可能会更容易。如果它们彼此在同一个表中,那么您需要担心ParentTable和ParentId或类似的复合键。
此外,如果两种评论类型有所不同,那么将它们放在数据库中的单独表格中要容易得多。