Database 处理数据库交叉外键
我有以下表格: 用户表:Database 处理数据库交叉外键,database,database-design,database-schema,Database,Database Design,Database Schema,我有以下表格: 用户表: id | username | password | join_date | avatar_image_id 图像表: id | url | user_owner_id 图像表保存帖子、文章和用户化身的所有图像。每个图像都属于可以编辑它的用户。因此,user\u owner\u id是必要的,但仅仅知道哪个图像是用户的化身是不够的,所以我需要avatar\u image\u id 这个交叉外键有问题吗?这是一个糟糕的设计吗?有什么办法可以解决吗?一般来说,是的交叉外
id | username | password | join_date | avatar_image_id
图像表:
id | url | user_owner_id
图像表保存帖子、文章和用户化身的所有图像。每个图像都属于可以编辑它的用户。因此,user\u owner\u id
是必要的,但仅仅知道哪个图像是用户的化身是不够的,所以我需要avatar\u image\u id
这个交叉外键有问题吗?这是一个糟糕的设计吗?有什么办法可以解决吗?一般来说,是的
交叉外键
是一个痛苦的过程,特别是在您想要删除(或存档)的情况下。这是因为您将无法删除这两行
处理此问题的一种方法是使用NOCHECK
约束定义avatar\u image\u id
另一种方法是向表
IMAGE
IsAvatarImage
中添加BIT
列。有了正确的索引,这种方法对性能的影响应该是最小的。这里有几个选项
选项1
您可以在图像表中执行此操作:-
id
url
user_owner_id
user_avatar_id
列是用户表的外键user\u avatar\u id
允许为空,表示图像不是任何人的化身user\u avatar\u id
- 由于每个用户只有一个化身,
应该是唯一的user\u Avatar\u id
avatar_url
这将使得为给定用户快速、轻松地找到化身图像。但是,它可能使图像编辑代码复杂化,因为现在你必须考虑存储在<代码>图像< /代码>表中的东西以及这些特殊的化身图像。
总而言之,我可能会选择选项1。将
用户\所有者\ id
从外键更改为正常行如何?我不需要在上面搜索太多。通常的联接是从用户表到图像,而不是从用户表到图像。@sheno。你的问题是关于设计:-)user\u owner\u id
是更强的外键
。在概念数据库设计中,搜索是不同的事情。只是为了澄清一下,当我写得更强大时,我的意思是,user\u owner\u id
无论如何都不能被替换,而avatar\u image\u id
可以被替换为我写的image.IsAvatarImage
BIT