【发布时间】:2012-02-24 00:57:46
【问题描述】:
对数据库中的整个数据实现超类型和子类型是不是很糟糕?在转向这个方向之前,我需要一些建议......
例如,
我将这些表作为对象,它们是相关的,
users
pages
images
entities 表作为超类型
entity_id entity_type
1 page
2 page
3 user
4 user
5 image
6 image
users表
user_id entity_id
1 3
2 4
pages表
page_id entity_id
1 1
2 2
images表
image_id entity_id
1 5
2 6
这是映射 images 表和entities 表的表,因为某些图像属于某个页面(可能是将来的博客文章等),
map_entity_image表
entity_id image_id
1 1
1 2
所以,当我要创建页面、图像、用户等时,我将在entities 表中插入一行。
最终,这些表中的行数将大量增加。所以我担心它可以处理大量行吗?这个数据库会随着时间变得越来越慢吗?
毕竟,这是一个糟糕的结构吗?
或者我做的超类型/子类型不正确?
编辑:
我认为entity 应该只有这些数据,
entity_id entity_type
1 page
2 page
除非我想给用户等附加图片,否则应该是这样的,
entity_id entity_type
1 page
2 page
3 user
4 user
也许我错了……
编辑:
所以这是我如何找出页面 id 1 附加了多少图像的查询,
SELECT E.*, P.*, X.*,C.*
FROM entities E
LEFT JOIN pages P ON (P.entity_id = E.entity_id)
LEFT JOIN map_entities_images X ON (X.entity_id = E.entity_id)
LEFT JOIN images C ON (C.image_id = X.image_id)
WHERE P.page_id = 1
返回 2 张图片。
【问题讨论】:
-
您希望如何使用这个实体表?基表上的标准 SQL 不会为您提供什么?当它没有明显的功能时,您为什么要为此烦恼?
-
谢谢。请看看我的编辑。谢谢。
-
您可以拥有一个同时被“页面”和“评论”引用的图像表。您不需要任何额外的表格(假设每个评论中只有一个对图像的引用)您只需要一列来保存图像 ID 并且一切正常!如果存在多对多关系,则需要一个带有 page-id 和 image-id 的交集表“page-contains-image”,以及一个带有 user-id 和 image-id 的表“user-has-image”。保持简单!
标签: mysql sql relational-database subtype supertype