【问题标题】:OOP Associations and database accessOOP 关联和数据库访问
【发布时间】:2013-04-26 04:05:37
【问题描述】:

我的项目有一个类软件和另一个类操作系统。一个软件可能支持多个操作系统(我的实际问题要复杂得多)。

我不确定如何以最有效的方式将其保存在我的数据库中。我的表结构如下:

表:操作系统

id        name          platform
=================================
winxp     Windows XP    windows
win7      Windows 7     windows
...

表格:软件

id        name             publisher     os
====================================================
chrome    Google Chrome    google        winxp,win7,...
ccleaner  Ccleaner         piriform      winxp,win7,...
...

这是最好的方法吗?这会在使用 OOP 编程时引起任何问题(我使用 DAO 方法)还是应该像下面这样更改它:

表:操作系统

id        name          platform
=================================
winxp     Windows XP    windows
win7      Windows 7     windows
...

表格:软件

id        name             publisher  
=====================================
chrome    Google Chrome    google      
ccleaner  Ccleaner         piriform   
...

表:os_support

softwareid        os
======================
chrome            winxp
chrome            win7
ccleaner          winxp
ccleaner          win7
ccleaner          win8
...

【问题讨论】:

    标签: database oop associations


    【解决方案1】:

    您当前的方法是错误的 - 您的软件表中存在冗余。 我不确定winxp,win7... 是什么意思 - 在一个单元格中存储多个值?这也是错误的方式 - 值应该是原子的(第一范式) - 但如果你的意思是在每个操作系统的软件表中复制行 - 就会有冗余 - 就像我在开始时所说的那样。

    第二种方法看起来要好得多(当然,如果您去掉 software 表中的 os 列)。

    为确保字段/表组织正确,您应该阅读规范化。参考this. 第三种范式就是你需要的:)

    【讨论】:

    • (编辑了我的问题更改软件表)。 winxp,win7 表示软件支持的操作系统。在“软件”表中,id 是主键。
    • 但是我的数据库可能有上千个软件,每个软件支持5-6个操作系统。所以第二种方法比第一种方法占用更多的空间。
    • winxp,win7 表示该软件支持的操作系统。 我知道,但是在第一种方法中,您想将这些值存储在一个单元格中吗?
    • 如果我是你,我会为了方便和性能而牺牲一个空间。如果您的数据库真的像您所说的那样大,那么冗余不是您想要的。更重要的是,如果你正确地创建索引,你的数据库会很快。 Mayby值得考虑额外的表吗?我的意思是诸如附加操作系统包之类的东西。假设您有 Windows Pack(包含 W7、XP 等)并且 os_support 引用该表。
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多