Sql 将软件构造链接到关系表的行值 TL;博士

Sql 将软件构造链接到关系表的行值 TL;博士,sql,database,data-structures,Sql,Database,Data Structures,将编程对象(如变量)链接到查找表中的行的首选方法是什么 似乎最好的方法是在软件中的某些数据结构(如枚举)中硬编码查找表的PKs并使用它。这就是大多数人所做的,还是我遗漏了另一个解决方案 他那是什么意思? 假设您有两个表: 以及一些使用它们的软件: 类参数: 应力=1参数名称=应力kPa bow=2参数_name=bow um 未知=3参数名称=未知 def add_main_table_itemparam,数据: 如果参数==应力: param_id=参数应力 elif参数==船首: param

将编程对象(如变量)链接到查找表中的行的首选方法是什么

似乎最好的方法是在软件中的某些数据结构(如枚举)中硬编码查找表的PKs并使用它。这就是大多数人所做的,还是我遗漏了另一个解决方案

他那是什么意思? 假设您有两个表:

以及一些使用它们的软件:

类参数: 应力=1参数名称=应力kPa bow=2参数_name=bow um 未知=3参数名称=未知 def add_main_table_itemparam,数据: 如果参数==应力: param_id=参数应力 elif参数==船首: param_id=param.bow 其他: param_id=param.unknown 在'data``参数_id`中插入'value`值2,3.14159; magic_insert_functionparam_id,数据 我的问题与枚举中那些硬编码的PK值1、2和3有关。这是最好的方式吗

可能的解决办法: 下面是我为解决这个问题而想到的一些想法。问题是我似乎无法决定使用哪一种

选项1:使用枚举,如示例中所示 这使编程变得很好,但也有一些缺陷:

如果字符串表示形式参数名称发生更改,则枚举将取消与表的链接,从而导致混淆 如果向参数表中添加了另一行,则需要更新枚举,从而需要更新程序。 我们可以通过创建一个动态生成的枚举来扩展它,这基本上是在创建时将整个参数表拉入其中,但这会出现如下问题

使字符串编程友好,替换空格,删除特殊字符,等等,使得很难说枚举bow_中心链接到行bow_中心 表示形式的改变意味着代码的改变。 选项2:添加软件名称列 我们可以在参数表中添加一列,这是软件在引用行时应该使用的。此列必须是唯一的

缺陷:

这实际上是在添加另一个PK列 “软件名称”列必须是非描述性的,否则它最终将与参数名称不相交。 选项3:查找字符串值 我们可以在每次需要使用PK值时查找它,而不是硬编码PK值。例如:

def add_main_table_itemparam,数据: 从'parameter'中选择'parameter\u id',其中'param\u name`='bow' param_id=magic_select_functionparam 在'data``参数_id`中插入'value`值2,3.14159; magic_insert_functionparam_id,数据 这基本上将链接从主键转移到字符串表示。这也有类似的缺点:

如果字符串表示参数名称更改,则需要更改代码。 假设没有缓存,则将执行的查询数增加一倍 参考:创建表的SQL 如果不存在“mydb”,则创建表。`参数` `参数_id`INT非空自动增量, `参数名称'VARCHAR45不为空, 主键`parameter_id`, 唯一索引'param_name_UNIQUE``param_name`ASC 引擎=InnoDB 如果不存在“mydb”,则创建表。“数据” `数据\u id`INT非空自动增量, `参数_id`INT不为空, `值'FLOAT NOT NULL, 主键'data\u id`, 索引'data\u parameter\u id\u idx`` parameter\u id`ASC, 约束`main_table_lookup_table_id` 外键`parameter\u id` 引用'mydb`.'parameter``parameter\u id` 不删除任何操作 更新时不执行任何操作 引擎=InnoDB