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指的是images
的id
。这种方法背后的想法是因为这些表之间的关系是一对一的,因此 posts
和 users
并不真正需要它们自己的 ID。
此外,这种方法将允许我使用
向image_id
添加约束
$table->foreignId('image_id')->constrained();
$table->unique(['image_id']);
我相信这是可行的。但是,您对此有何见解?使用这种方法有什么我想念的吗?您是否认为这是面向未来的证明,例如如果将来添加新的 child 模型?在这种方法和 Laravel 文档中所写的方法之间,您会选择哪一种?
编辑
看了@AlexMax 的评论,我现在意识到我的概念被颠覆了! Laravel 的示例将 images
视为 child;而在我的范式中,posts
和 users
被认为是 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_a
和 document_type_b
。使用哪一个将根据documents
的type
来确定。
所以,回到问题:你怎么看?
另外:这还算多态关系吗?
您可以采用这种方法,但我相信未来的证明。通过创建主 uuid 可能会在将来为您提供灵活性。您还创建了一个反向依赖关系,表示如果用户存在,则它必须具有 image_id。无论这是否是意图,很可能会通过设计以这种方式阅读。我所说的未来验证的意思是,您希望在数据库中关闭以进行修改并打开以进行扩展。例如,如果你只有一个多态 table 和创建主键,你将不必修改预先存在的代码,而是创建一个新的 class、table(对于那个 class), 以及不更改图像中一行代码的关系 class 他们目前正在做的方式图像需要注意。因此,您将被迫为每个 class 具有与之关联的图像的特征。您还会丢失图像的历史记录。例如,用户更改了他们的个人资料图片,您只能参考最后一张图片而不是图片历史。
我正在使用 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指的是images
的id
。这种方法背后的想法是因为这些表之间的关系是一对一的,因此 posts
和 users
并不真正需要它们自己的 ID。
此外,这种方法将允许我使用
向image_id
添加约束
$table->foreignId('image_id')->constrained();
$table->unique(['image_id']);
我相信这是可行的。但是,您对此有何见解?使用这种方法有什么我想念的吗?您是否认为这是面向未来的证明,例如如果将来添加新的 child 模型?在这种方法和 Laravel 文档中所写的方法之间,您会选择哪一种?
编辑
看了@AlexMax 的评论,我现在意识到我的概念被颠覆了! Laravel 的示例将 images
视为 child;而在我的范式中,posts
和 users
被认为是 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_a
和 document_type_b
。使用哪一个将根据documents
的type
来确定。
所以,回到问题:你怎么看?
另外:这还算多态关系吗?
您可以采用这种方法,但我相信未来的证明。通过创建主 uuid 可能会在将来为您提供灵活性。您还创建了一个反向依赖关系,表示如果用户存在,则它必须具有 image_id。无论这是否是意图,很可能会通过设计以这种方式阅读。我所说的未来验证的意思是,您希望在数据库中关闭以进行修改并打开以进行扩展。例如,如果你只有一个多态 table 和创建主键,你将不必修改预先存在的代码,而是创建一个新的 class、table(对于那个 class), 以及不更改图像中一行代码的关系 class 他们目前正在做的方式图像需要注意。因此,您将被迫为每个 class 具有与之关联的图像的特征。您还会丢失图像的历史记录。例如,用户更改了他们的个人资料图片,您只能参考最后一张图片而不是图片历史。