舞蹈事件轨迹列表存储的数据库设计

时间:2012-03-12 09:32:18

标签: python database sqlite database-design

我正在用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数据库中,而无需将它们存储到字符串中?

2 个答案:

答案 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语句应该如何使它们成为新的问题。