使用表作为数组来实现一对多关系是否更好?
Is it better to implement one-to-many relationship using tables as arrays?
最近在研究数据库设计,学习数据库中的关系。因此,例如,想象一个用于音乐管理的应用程序,基本上有专辑和曲目,每个专辑有很多曲目,但每个曲目有一张专辑。据我所知,应该这样做:
曲目:
id
姓名
album_id
1
测试 1
1
2
测试2
1
3
测试3
2
4
测试4
1
5
测试5
2
专辑:
id
姓名
1
专辑1
2
专辑2
这是一个基本的一对多关系。但是,如果我想获得专辑中所有曲目的列表,我应该 运行 对曲目 table 和 select 具有匹配 ID 的所有行进行查询,这也意味着处理 ID 不匹配的。相反,如果每张专辑在 table 中都有一个曲目数组作为一列呢?所以这无法完成,但我可以为每个名为“Album1_Tracks”的专辑创建一个 table 并在其中存储曲目并向专辑 table 添加一个名为“Table_Name”来识别查询时的table。该模型将如下所示:
Album1_Tracks:
id
姓名
1
测试 1
2
测试2
3
测试4
Album2_Tracks:
id
姓名
1
测试3
2
测试5
专辑:
id
姓名
Table_Name
1
专辑1
Album1_Tracks
2
专辑2
album2_Tracks
在这种情况下,每当我想获取专辑中所有曲目的列表时,我只需要通过查询获取 table 名称,然后获取该 table 中的所有记录没有检查任何东西。虽然在这种设计中查找特定曲目的专辑名称效率太低,但如果我只想获取专辑中所有曲目的列表而不是反之,这种设计在查询性能方面是否更好?
编辑:JOIN
通常用于此目的,但这种设计会比 JOIN
获得更好的性能吗?
一般来说,SQL 与少量 table 相比,对于特定实体的每个实例都需要一个新的 table 的设计,效果要好得多.
在您的情况下,相关实体是相册。根据您的第一个设计,将您所有的相册放在一个 table 中,并使用单独的 id 值。
形式的查询
SELECT Track.Name, Album.Name
FROM Track
JOIN Album ON Track.Album_ID = Album.ID
WHERE Album.Name = 'Revolver'
效率惊人。它将利用 Album_ID 列上的 SQL 索引。如果索引存在,它将避免您在问题中提到的完整 table 扫描(“处理具有不匹配 ID 的”)。
第二种方法还有另一个问题:在 SQL 查询中,table 的名称必须是常量。您不能将列的值用作 table(或列或数据库)的名称。
程序员花费了数千(真的)年的时间来提高 SQL 查询的效率。试图超越 MySQL 或其他 RDBMS 软件中的查询优化器软件几乎没有任何收获。
最近在研究数据库设计,学习数据库中的关系。因此,例如,想象一个用于音乐管理的应用程序,基本上有专辑和曲目,每个专辑有很多曲目,但每个曲目有一张专辑。据我所知,应该这样做:
曲目:
id | 姓名 | album_id |
---|---|---|
1 | 测试 1 | 1 |
2 | 测试2 | 1 |
3 | 测试3 | 2 |
4 | 测试4 | 1 |
5 | 测试5 | 2 |
专辑:
id | 姓名 |
---|---|
1 | 专辑1 |
2 | 专辑2 |
这是一个基本的一对多关系。但是,如果我想获得专辑中所有曲目的列表,我应该 运行 对曲目 table 和 select 具有匹配 ID 的所有行进行查询,这也意味着处理 ID 不匹配的。相反,如果每张专辑在 table 中都有一个曲目数组作为一列呢?所以这无法完成,但我可以为每个名为“Album1_Tracks”的专辑创建一个 table 并在其中存储曲目并向专辑 table 添加一个名为“Table_Name”来识别查询时的table。该模型将如下所示:
Album1_Tracks:
id | 姓名 |
---|---|
1 | 测试 1 |
2 | 测试2 |
3 | 测试4 |
Album2_Tracks:
id | 姓名 |
---|---|
1 | 测试3 |
2 | 测试5 |
专辑:
id | 姓名 | Table_Name |
---|---|---|
1 | 专辑1 | Album1_Tracks |
2 | 专辑2 | album2_Tracks |
在这种情况下,每当我想获取专辑中所有曲目的列表时,我只需要通过查询获取 table 名称,然后获取该 table 中的所有记录没有检查任何东西。虽然在这种设计中查找特定曲目的专辑名称效率太低,但如果我只想获取专辑中所有曲目的列表而不是反之,这种设计在查询性能方面是否更好?
编辑:JOIN
通常用于此目的,但这种设计会比 JOIN
获得更好的性能吗?
一般来说,SQL 与少量 table 相比,对于特定实体的每个实例都需要一个新的 table 的设计,效果要好得多.
在您的情况下,相关实体是相册。根据您的第一个设计,将您所有的相册放在一个 table 中,并使用单独的 id 值。
形式的查询
SELECT Track.Name, Album.Name
FROM Track
JOIN Album ON Track.Album_ID = Album.ID
WHERE Album.Name = 'Revolver'
效率惊人。它将利用 Album_ID 列上的 SQL 索引。如果索引存在,它将避免您在问题中提到的完整 table 扫描(“处理具有不匹配 ID 的”)。
第二种方法还有另一个问题:在 SQL 查询中,table 的名称必须是常量。您不能将列的值用作 table(或列或数据库)的名称。
程序员花费了数千(真的)年的时间来提高 SQL 查询的效率。试图超越 MySQL 或其他 RDBMS 软件中的查询优化器软件几乎没有任何收获。