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