相关疑难解决方法(0)

为什么外键在理论上比在实践中更多?

当你研究关系理论时,外键当然是强制性的.但实际上,在我工作的每个地方,表产品和连接总是通过在查询中明确指定键来完成,而不是依赖于DBMS中的外键.

这样,您当然可以按字段连接两个表,这些字段不是外键,具有意外结果.

你为什么这么认为?DBMS是否应该强制只使用外键来创建联接和产品?

编辑:谢谢你的所有答案.现在我很清楚,FK的主要原因是参考完整性.但是如果你设计一个DB,模型中的所有关系(ERD中的IE箭头)都会成为外键,至少在理论上,无论你是否在DBMS中定义它们,它们都是语义上的FK.我无法想象需要通过不是FK的字段来连接表.有人能给出一个有意义的例子吗?

PS:我知道N:M关系变成了单独的表而不是外键,为简单起见省略了它.

sql database foreign-keys

49
推荐指数
6
解决办法
2万
查看次数

定义没有外键的关系

如何在没有外键的情况下建立关系?

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'foreign(Custom.name) == "{name}"'.format(name=cls.__name__)  
    return db.relationship('Custom', primaryjoin=joinstr) 
Run Code Online (Sandbox Code Playgroud)

这引发了一个错误:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

这有效,但我认为这是一个非常丑陋的黑客.

@declared_attr
def custom_stuff(cls):
    joinstr = 'or_(
                  and_(foreign(Custom.name) == MyTable.title, 
                       foreign(Custom.name) != MyTable.title), 
                  foreign(Custom.name) == "{name}")'.format(name=cls.__name__)
    return db.relationship('Custom', primaryjoin=joinstr)
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

编辑:额外的属性需要添加为@declared_attr必须使用关系,因为我们的序列化程序是编写的,因此它适用于声明的attrs.

@hybrid_property其他东西做这件事会有效,但是我们的json序列化器会破坏.让它发挥作用似乎比定义关系更难.

python sqlalchemy relationship

7
推荐指数
1
解决办法
1074
查看次数

标签 统计

database ×1

foreign-keys ×1

python ×1

relationship ×1

sql ×1

sqlalchemy ×1