laravel 与 sql 中的一对一多态 table 结构

one to one polymorphic table structure in laravel with sql

我正在使用 Laravel 8 尝试创建一个数据库设计,其中的内容最终证明是一对一的多态关系(以前从未使用过)。但是看到Laravel的文档here,我不禁想知道为什么不使表具有这样的一对一多态关系:

images
    id - integer
    url - string
    imageable_type - string

posts
    image_id - integer
    name - string
 
users
    image_id - integer
    name - string

with image_id in posts and users set as foreign-primary key指的是imagesid。这种方法背后的想法是因为这些表之间的关系是一对一的,因此 postsusers 并不真正需要它们自己的 ID。

此外,这种方法将允许我使用

image_id添加约束
$table->foreignId('image_id')->constrained();
$table->unique(['image_id']);

我相信这是可行的。但是,您对此有何见解?使用这种方法有什么我想念的吗?您是否认为这是面向未来的证明,例如如果将来添加新的 child 模型?在这种方法和 Laravel 文档中所写的方法之间,您会选择哪一种?

编辑

看了@AlexMax 的评论,我现在意识到我的概念被颠覆了! Laravel 的示例将 images 视为 child;而在我的范式中,postsusers 被认为是 children。也许我应该将示例案例更改为:

documents
    id - integer
    type- string
    document_type - string

document_type_a
    document_id - integer
    name - string
 
document_type_b
    document_id - integer
    name - string

附带说明:每次创建新的 documents 时,它都会为其 children 之一创建一条新记录(由应用程序处理)。在这种情况下,children 是 document_type_adocument_type_b。使用哪一个将根据documentstype来确定。

所以,回到问题:你怎么看?

另外:这还算多态关系吗?

您可以采用这种方法,但我相信未来的证明。通过创建主 uuid 可能会在将来为您提供灵活性。您还创建了一个反向依赖关系,表示如果用户存在,则它必须具有 image_id。无论这是否是意图,很可能会通过设计以这种方式阅读。我所说的未来验证的意思是,您希望在数据库中关闭以进行修改并打开以进行扩展。例如,如果你只有一个多态 table 和创建主键,你将不必修改预先存在的代码,而是创建一个新的 class、table(对于那个 class), 以及不更改图像中一行代码的关系 class 他们目前正在做的方式图像需要注意。因此,您将被迫为每个 class 具有与之关联的图像的特征。您还会丢失图像的历史记录。例如,用户更改了他们的个人资料图片,您只能参考最后一张图片而不是图片历史。