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
    应该是唯一的
这样做的好处是,您可以继续在只需要前三列的代码中一般地处理所有图像。只有当你有用于化身图像的特定代码时,你才需要考虑最后一列。

这有效地实施了“每个用户有0或1个化身”的规则。也许当用户第一次被创建时,他们还没有头像,所以这可以吗?如果每个用户都必须有一个化身,并且您希望在数据库中强制执行此操作,则需要选项2

选项2

所有图像放在同一张表中有多大必要?你经常用同一段代码来处理化身图像和其他图像吗?如果没有,可以考虑将以下列添加到用户表:-< /P>
avatar_url
这将使得为给定用户快速、轻松地找到化身图像。但是,它可能使图像编辑代码复杂化,因为现在你必须考虑存储在<代码>图像< /代码>表中的东西以及这些特殊的化身图像。
总而言之,我可能会选择选项1。

用户\所有者\ id
从外键更改为正常行如何?我不需要在上面搜索太多。通常的联接是从用户表到图像,而不是从用户表到图像。@sheno。你的问题是关于
设计
:-)
user\u owner\u id
是更强的
外键
。在概念数据库设计中,搜索是不同的事情。只是为了澄清一下,当我写得更强大时,我的意思是,
user\u owner\u id
无论如何都不能被替换,而
avatar\u image\u id
可以被替换为我写的
image.IsAvatarImage
BIT