【问题标题】:Merging Database tables Unique fields issue合并数据库表唯一字段问题
【发布时间】:2011-12-13 14:01:11
【问题描述】:

我有一个程序(我无法更改,它是一个由其他开发人员编写的音乐应用程序),它使用几个访问 97' 数据库。其中一个数据库是“Playlists”数据库,其中包含 2 个表“PlaylistNames”和“PlaylistSongs”。

“PlaylistNames”表有一个长类型的 AutoIncrement、Unique、PrimaryKey“autoID”列,一个保存每个播放列表名称的“PlaylistName”字符串列和一个定义播放列表是否由以下人员创建的“isServerPlaylist”布尔列用户或从服务器发送。

“PlaylistSongs”表有一个 AutoIncrement、Unique、PrimaryKey“autoID”列、一个“PlaylistID”列,它是一个指向前一个表“autoID”字段的 ForeignKey,以及一个指向另一个表的“TrackID”列 ForeignKey歌曲信息。

这两个表中的记录如下所示:

“播放列表名称”

autoID:01 PlaylistName:Rock isServerPlaylist:True

autoID:02 PlaylistName:Pop isServerPlaylist:True

“播放列表歌曲”

autoID:01 PlaylistID:01 TrackID:100

autoID:02 PlaylistID:01 TrackID:101

autoID:03 PlaylistID:01 TrackID:102

autoID:04 PlaylistID:02 TrackID:103

autoID:05 PlaylistID:02 TrackID:104

autoID:06 PlaylistID:02 TrackID:105

这意味着当前有 2 个播放列表,摇滚和流行,每个包含 3 首曲目。

现在,有数据库的客户端和服务器端副本。客户端数据库具有服务器的播放列表副本以及客户端将添加/创建的任何播放列表。服务器端的播放列表也会更新。

假设服务器播放列表是那些 2 Rock 和 Pop。如果用户添加/创建新的播放列表,PlaylistNames 表上的新记录将添加到客户端数据库中,其中 autoID = 03,客户端将选择的播放列表名称和 isServerPlaylist 字段 = false。在 PlaylistSongs 表中将添加与客户端将选择添加到播放列表中的歌曲一样多的记录。 playlistID 列将为 03。

服务器还会更新其播放列表,因此,通过服务器上的更新,我可能会添加/创建一个新的播放列表,该播放列表将在 PlaylistNames 表 autoID = 03 中具有我将选择的播放列表名称并将 isServerSide 列设置为 true。

我想要做的是合并这些播放列表,这样当在服务器端添加新的播放列表并且客户端创建了自己的播放列表时,合并的 PlaylistNames 表的 AutoID 主键列将具有唯一值。这就是我卡住的地方。你们能指出一个可以做到这一点的方法吗?

【问题讨论】:

    标签: c# winforms visual-studio ms-access


    【解决方案1】:

    我认为服务器端处理超出您的能力范围? (即合并两个播放列表?)

    在这种情况下,我建议,当您的用户离线创建播放列表时,它会自动检查服务器上是否已经存在类似的播放列表。 从那里开始,您可以下载现有的服务器播放列表,然后添加到其中。或者您也可以只检查该服务器播放列表上的最高 ID,并确保您的离线播放列表从 (maximumIDserverside +1) 开始。

    【讨论】:

    • 感谢您的回复。是的,由于这个问题,目前没有合并播放列表数据库,唯一的更新发生在歌曲上,这是通过检查 2 个数据库是否有不同的记录数来完成的硬编码更新。如果是这样,则下载客户端数据库中丢失的歌曲,并删除表并使用新条目重新创建。但是这种方法有一个问题,该应用程序是咖啡店酒吧等的连续音乐播放器。如果同时发生桌子的放置和重新创建,可能会导致播放器停止
    • 带有歌曲混合(当数据库被删除时播放器中的下一首歌曲尝试播放)。到目前为止,公司没有遇到过这样的问题,下降和娱乐大约需要第二次。但这不是最好的方法。问题是播放列表是在其他开发人员创建的应用程序中创建/添加的,并且数据库也从该应用程序更新,这意味着我无法在任何表上使用 autoIncrement 步骤“播放”。我要尝试将两个表合并到一个表中,使 PlaylistSongs 表数据与播放列表位于同一记录中
    • 他们属于。然后将数据再次拆分为 2 个表。
    • 好吧,我上次说的没有多大意义,因为播放列表歌曲的数量不是静态的。一个播放列表可能有 20 首歌曲,而另一个可能有更少或更多,所以我真的不知道要添加多少列到 tmp 表中,该表将包含 2 个表中的所有数据。它可以工作,但它不是最好的解决方案。当客户端尝试在播放列表中添加的歌曲多于我在临时表中创建的用于保存每个播放列表的歌曲的列时,可能会出现问题。我明天试试。无论如何,这是一个临时解决方案,我正在为公司开发新的解决方案
    • 您为什么要使用列将歌曲添加到播放列表?我建议在播放列表和歌曲之间建立 1-* 关系,并将歌曲所属的播放列表的 ID 添加到歌曲表中。这样,您可以添加任意数量的歌曲。更多歌曲 = 更多行,而不是列。
    【解决方案2】:

    这更简单。将 isServerPlaylist 字段添加到主键并播放。

    【讨论】:

    • κρίμα(=怜悯)。怎么会这样?
    • 抱歉,我可能误解了您的建议。向主键添加另一个字段是什么意思?你的意思是我应该将 isServerSide 设置为主键吗?
    • 没有。您的主键应该是 audioID 和 isServerPlaylist(两者)
    • 对,这里是数据库新手。我不知道我可以将 2 个字段设置为一个主键。我不明白这有什么帮助。你能解释一下吗?
    • 您将拥有一对 audioID 和 isServerPlaylist 作为 [1, YES] 和 [1, NO]。换句话说,每个 audioID 可以在数据库中存在两次。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多