我正在用Python编写一个简单的数据库接口。数据库是一个简单的数据库,存储哪些轨道在哪个事件和哪个艺术家播放。虽然数据库的设计是,但Python中的接口还不是问题。我想出了以下的事情:
--- EVENTS ---
CREATE TABLE events (
id INTEGER PRIMARY KEY autoincrement,
event_name TEXT NOT NULL,
event_date TEXT NOT NULL,
<list of tracklist-ids - foreign key?>
);
--- TRACKLISTS ---
CREATE TABLE tracklists (
id INTEGER PRIMARY KEY autoincrement,
artist TEXT NOT NULL,
<list of track-ids - foreign key?>
);
--- TRACKS ---
CREATE TABLE tracks (
id INTEGER PRIMARY KEY autoincrement,
trackartist TEXT NOT NULL,
trackname TEXT NOT NULL,
timesplayed INTEGER NOT NULL,
);
这对我来说感觉不合逻辑,我需要通过许多操作来从数据库中获取一些简单的东西,很少有例子:
获取的歌曲(轨道)的列表由艺术家A的年2006年一直玩到2009年:将需要通过“tracklists”表循环,从而让艺术家A的每个tracklistid,然后看看它在“事件'table(已经很痛苦,如何存储列表?)
查找哪位艺术家在大多数时间播放曲目:循环播放整个“曲目列表”并获得某种寻找曲目轨迹A的计数器
它可能会有点混乱,因为我说的是很多不同的东西,但对我来说,似乎我的数据库设计得更好,或者我应该使用某种其他方法来解决这个程序数据库的问题?我正在寻找一个基本的启动或提示/提示,以使这个数据库更有效和更好。我知道不是每个查找都可以快速,但对我来说这似乎不是很有效。另外,有没有更好的方法将列表存储到SQL数据库中,而无需将它们存储到字符串中?
答案 0 :(得分:2)
我同意Jens Schauder的意见,你想让DBMS担心过滤和计数,但我不同意表格列表是好的,因为OP建议不规范化。这不是一个小问题,因为它会阻止DBMS完成其工作。
另外,重要的是,我们的想法不是保持每次播放曲目的次数,而是记录每次播放曲目的记录。不同之处在于您要存储的是事件历史记录,而不是事件摘要。
你想要的是看起来更像这样的表:
--- EVENTS ---
CREATE TABLE events (
id INTEGER PRIMARY KEY autoincrement,
event_name TEXT NOT NULL,
event_date TEXT NOT NULL,
);
--- ARTISTS ---
CREATE TABLE artists (
id INTEGER PRIMARY KEY autoincrement,
artist_name TEXT NOT NULL
);
--- TRACKS ---
CREATE TABLE tracks (
id INTEGER PRIMARY KEY autoincrement,
trackname TEXT NOT NULL,
artist_id INTEGER,
FOREIGN KEY(artist_id) REFERENCES artists(id)
);
--- PERFORMANCES ---
CREATE TABLE performances (
id INTEGER PRIMARY KEY autoincrement,
event_id INTEGER,
track_id INTEGER,
FOREIGN KEY (event_id) REFERENCES events(id),
FOREIGN KEY (track_id) REFERENCES tracks(id)
);
此表结构采用第三范式(3NF),并且易于写入和查询。
答案 1 :(得分:0)
乍一看,您的数据库看起来很好,只有一个例外,即您不在一个表中存储ID列表,而是从另一个表中返回该表的引用。
您描述的循环是99%的数据库使用'count'和'join'完成的案例
数据库在计算和查找时非常好用且快速。
如果你需要详细的帮助,你的sql语句应该如何使它们成为新的问题。