C# 将类作为设置项存储在sql中是一个好主意吗?

C# 将类作为设置项存储在sql中是一个好主意吗?,c#,sql,database,database-design,C#,Sql,Database,Database Design,我在c#中做这个项目,在设计数据库时,我使用一个规则,即每个类基本上都是sql表(至少是必须持久化的类) 由于有些类纯粹用于定义业务设置,而且类相当扁平,我很好奇这样做有什么意义吗 转换业务层类 class Contact { public string Name {get;set;} public string PhoneNumber {get;set;} public bool AcceptsTextMessages {get;set;} public bool AllowedHoursFo

我在c#中做这个项目,在设计数据库时,我使用一个规则,即每个类基本上都是sql表(至少是必须持久化的类)

由于有些类纯粹用于定义业务设置,而且类相当扁平,我很好奇这样做有什么意义吗

转换业务层类

class Contact
{
public string Name {get;set;}
public string PhoneNumber {get;set;}
public bool AcceptsTextMessages {get;set;}
public bool AllowedHoursForTextMessagesStart {get;set;}
public bool AllowedHoursForTextMessagesEnd {get;set;}
public List<DayOfWeek> SendMessagesOnlyOnWorkdays {get;set;}
}
与现实生活中的数据

ID   Name                                Value
1    Name                                John Doe
2    PhoneNumber                         01234657
3    ExceptsTextMessages                 true
4    AllowedHoursForTextMessagesStart    0
5    AllowedHoursForTextMessagesEnd      24
6    SendMessagesOnlyOnDays              1,2,3,4,5

这样做的主要原因是有一个设置表,而不是像类一样有多个表,可能更容易修改类,更容易在类之间操作属性(如果业务逻辑需要将一个属性从一个类移动到另一个类)

将对象分解为ID和属性值对是有时非常有用的技术之一。EAV数据的管理要比具有单个列的平面表复杂得多,因此它不是容易实现的

考虑到你的帖子,我可能不会。你所拥有的所有领域似乎都与接触密切相关,不太可能需要在生产过程中动态改变(因为你开始或停止接受短信,而不是提升到一个与短信在认识论上无关的存在层面)


即使将某些字段表示为成对字段是有意义的,我也只会对这些字段执行此操作:保留一个带有主键和基本数据的用户表,然后将其余字段放在与用户具有外键关系的EAV表中。

考虑到不同的用户可能具有不同的设置,第一种方法可能更易于实现。当一个表有太多的列,或者列本身在不同实体之间存在显著差异时,您确实只想使用第二种方法(正式称为实体属性值,EAV)。
ID   Name                                Value
1    Name                                John Doe
2    PhoneNumber                         01234657
3    ExceptsTextMessages                 true
4    AllowedHoursForTextMessagesStart    0
5    AllowedHoursForTextMessagesEnd      24
6    SendMessagesOnlyOnDays              1,2,3,4,5