Database 要处理的模式";“动态枚举”;用户可以修改的(编程语言不可知)

Database 要处理的模式";“动态枚举”;用户可以修改的(编程语言不可知),database,enums,design-patterns,Database,Enums,Design Patterns,我总是面对这个问题,每次我面对这个问题,我都会找到一个不同的解决方案,而这个解决方案并不让我满意。这种情况不适合特定的语言,但涉及数据库 想象一下,在管理应用程序中,用户(不是程序员)可以填写一个表,该表表示其员工的编程技能水平。然后他可以在Employees表中将这些值分配给Employees 数据库中的情况是这样的: Table: ProgrammingSkillLevel - ID - Name - Value Table: Employees - ID - SomeU

我总是面对这个问题,每次我面对这个问题,我都会找到一个不同的解决方案,而这个解决方案并不让我满意。这种情况不适合特定的语言,但涉及数据库

想象一下,在管理应用程序中,用户(不是程序员)可以填写一个表,该表表示其员工的编程技能水平。然后他可以在Employees表中将这些值分配给Employees

数据库中的情况是这样的:

Table: ProgrammingSkillLevel
  - ID
  - Name
  - Value
Table: Employees
  - ID
  - SomeUselessData
  - ProgrammingSkillLevelID
以编程的方式,我通常会以枚举的形式执行此操作(我将使用C#):

这种方法的优点是使用名称而不是值,事实上,如果我们将枚举更改为如下内容:

enum ProgrammingSkillLevel
{
    Starter = 0,
    Medium,
    Good,
    Advanced,
}
我们不会有任何问题,因为我们使用名称。 在我的数据库方法中,我使用id来避免一些字节浪费(我知道有enum类型,但用户应该填写表,而不是我!),而不是名称,因此优势肯定会丧失

我应该使用什么方法来允许用户生成我所称的“动态枚举”?我应该用名字吗


我想找到一个可能适用于我所有项目的好模式,因为我经常发现这种情况。

问题似乎包含了答案,
我没有找到更好的方法通过网络实现这一点,因此我将把它标记为一个答案。

如果用户可以更改值,则在数据库中使用
enum
显然不是一个选项,因此就我所知,您演示的表方法是最好的方法。您仍然可以添加值或重命名技能级别,但不能删除已使用的技能级别。唯一的问题是,如果在外键引用之外为
ProgrammingSkillLevelID
分配了一些业务意义。你能提供一个你发现这个模式不充分/不完善的用例吗?好吧,我想问一下这是否也是正确的模式。我真的不知道,因为我用这种方式“重新发明了轮子”(我的意思是,我自己也这么想,我不知道是否有更好的方法)。如果这是正确的,我可以删除该问题,因此(对此表示抱歉)
enum ProgrammingSkillLevel
{
    Starter = 0,
    Medium,
    Good,
    Advanced,
}