我有一个名为tracks的表,其中包含字段id和composer,字段composer可能只有一个名称,也可能是两个用逗号分隔的名称,或者是一百个用逗号分隔的名称,这似乎是一个糟糕的做法,并且使得编写查询变得非常复杂,因为composer的每个值都必须被视为一个值。我可以创建更多的字段,比如composer2,composer3等,最多可以创建100个,但是第二天我可能会有一个包含101个名字的值,有什么更好的方法来将这些数据存储到mysql数据库中呢?
id
composer
composer2
composer3
zfycwa2u1#
更好的方法:另一张table你所拥有的被称为多值属性,你的例子中你可以拥有多达100个 composer ,这表明你的意思是没有固定的限制。你知道SQL中还有什么没有固定的限制吗?* 行数。*通常的做法是将多值属性的每个值存储在其自己的行中,并引用回主表。
CREATE TABLE Tracks ( id INT PRIMARY KEY ... other single-valued attributes of a track ... ); CREATE TABLE Composers ( id INT PRIMARY KEY ... composer name and other attributes of a composer ... ); CREATE TABLE TrackComposers ( trackId INT, composerId INT, PRIMARY KEY (trackId, composerId), FOREIGN KEY (trackId) REFERENCES Tracks (id), FOREIGN KEY (composerId) REFERENCES Composers (id) );
此示例中的TrackComposers表实现了轨道与 composer 之间的多对多关系。对于每个轨道,TrackComposers中可能有多行。每行引用一个轨道和一个 composer 。这样你就不会对给定曲目的 composer 数量有任何限制,而且你还有其他好的功能,比如很容易找到某个人创作的所有曲目。
1条答案
按热度按时间zfycwa2u1#
更好的方法:另一张table
你所拥有的被称为多值属性,你的例子中你可以拥有多达100个 composer ,这表明你的意思是没有固定的限制。
你知道SQL中还有什么没有固定的限制吗?* 行数。*
通常的做法是将多值属性的每个值存储在其自己的行中,并引用回主表。
此示例中的TrackComposers表实现了轨道与 composer 之间的多对多关系。对于每个轨道,TrackComposers中可能有多行。每行引用一个轨道和一个 composer 。
这样你就不会对给定曲目的 composer 数量有任何限制,而且你还有其他好的功能,比如很容易找到某个人创作的所有曲目。