【问题标题】:What's the best way to organize my MySQL data tables for this data?为这些数据组织我的 MySQL 数据表的最佳方法是什么?
【发布时间】:2012-04-16 14:12:21
【问题描述】:

我正在为我家的家居装修业务设计工作估算软件,但对于如何最好地组织我的数据有点困惑。当然,会有一个用于存储作业名称、地址、描述等的“作业”数据库表。

每个作业都有一系列与之相关的测量值,这些测量值将继续用于生成估算(发送给潜在客户)和装载表(用于确定将哪些材料带到作业现场) .

我的问题是测量结果并不完全一致。这是我为测试这个概念而编写的一些代码 - 请注意,某些测量需要多个数组(请参阅:排水沟和百叶窗),并且许多项目需要的不仅仅是标准键(数量、unit_of_measure、描述、价格)。

众所周知,我不是编码高手,但我是来学习的。 MySQL 是不是在这里工作的错误工具?我需要一个不同的工具还是应该完全放弃使用数据库的想法?如果 MySQL 是答案,我应该如何组织这些数据?

我认为 JSON 存储在 db 中,但这似乎是一种糟糕的形式。

<?php
    $gable_soffit = array(
    'qty'=>125,
    'uom'=>'ft',
    'desc'=>"Gable Soffit",
    'price'=>6.50,
    'os'=>12,           // inches
    'ss'=>12            // inches
); 

// qty, uom, desc, price, overhang size, soffit size 
$level_soffit = array(
    'qty'=>200,
    'uom'=>'ft',
    'desc'=>"Level Soffit",
    'price'=>6.50,
    'os'=>12,           // inches
    'ss'=>12            // inches
); 

// qty, uom, price,desc
$brick_mold = array(
    'qty'=>15,
    'uom'=>feet,
    'price'=>1.50,
    'desc'=>"Brick Mold"
);

$gable_vents = array(
    'qty'=>5,
    'uom'=>ea,
    'price'=>48.00,
    'desc'=>"Gable Vents"
);

$window_tops = array(
    'qty'=>2,
    'uom'=>ea,
    'price'=>10.00,
    'desc'=>"Window Tops"
);

$openings = array(
    'qty'=>2,
    'uom'=>ea,
    'price'=>50,
    'desc'=>"Openings Capped"
);

$garage_doors = array(
    'qty'=>1,
    'uom'=>ea,
    'price'=>100,
    'desc'=>"Garage Doors Capped"
);

$porch_ceiling = array(
    'qty'=>124,
    'uom'=>sqft,
    'price'=>2.00,
    'desc'=>"Porch Ceiling"
);

$porch_beam = array(
    'qty'=>36,
    'uom'=>ft,
    'price'=>3.60,
    'desc'=>"Porch Beam"
);

$siding = array(
    'qty'=>22,
    'uom'=>sq,
    'price'=>165.00,
    'desc'=>"Siding"
);

$insulation = array(
    'qty'=>22,
    'uom'=>"sq",
    'price'=>30.00,
    'desc'=>"Insulation"
);

$shutters = array(
    array(
        'type'=>'Louvered',
        'length'=>50,
        'width'=>12,
        'color'=>'Brick Red'
    ),
    array(
        'type'=>'Louvered',
        'length'=>50,
        'width'=>12,
        'color'=>'Brick Red'
    ),
    array(
        'type'=>'Raised Panel',
        'length'=>36,
        'width'=>12,
        'color'=>'Black'
    ),
    array(
        'type'=>'Raised Panel',
        'length'=>50,
        'width'=>12,
        'color'=>'Black'
    ),
);

$gutters = array(
    array(
        'qty'=>100,
        'type'=>"5-inch",
        'uom'=>"ft",
        'desc'=>"5-inch Gutter",
        'price'=>3.00
    ),
    array(
        'qty'=>50,
        'type'=>"6-inch",
        'uom'=>"ft",
        'desc'=>"6-inch Gutter",
        'price'=>4.00
    ),
    array(
        'qty'=>10,
        'type'=>"screen",
        'uom'=>"ft",
        'desc'=>"Gutter Screen",
        'price'=>2.00
    ),
    array(
        'qty'=>5,
        'type'=>"guard",
        'uom'=>"ft",
        'desc'=>"Gutter Guard",
        'price'=>5.00
    )
);
?>

【问题讨论】:

    标签: php mysql codeigniter database-design


    【解决方案1】:

    有趣的答案:如果您想尝试新事物,可以使用MongoDB - 这是一个面向文档的数据库,带有 JSON 样式的文档。它使用提供简单性和强大功能的动态模式。它应该完全符合您的需求。

    无聊的答案:您可以使用 MySQL 来做到这一点,方法是创建一个只包含所有产品通用的最基本字段的表。

    Products
    id    name         quantity   description   price
    2     Level Soffit 200        Level Soffit  6.50
    5     Porch Beam   36         Porch Beam    3.60
    

    此外,您可以有一个表格来保存您的属性。

    Attributes
    id    attribute    value
    2     Os           12
    2     Ss           12
    5     Color        Black
    5     Color        Brown
    

    【讨论】:

    【解决方案2】:

    我的建议是在 Drupal 7 中使用 Views 3 以及 Node Relationship 和 Node Reference 模块来构建网站来进行报告。这就是你想要做的。您创建一个作业内容类型和一个项目内容类型。

    项目内容类型将包含:

    1. 您的项目名称(节点标题)
    2. 描述(节点主体,如果你想使用描述)
    3. 数量字段
    4. 一个长度测量字段,一个宽度测量字段,一个深度测量字段
    5. 测量类型(英尺、米、英寸等使其成为下拉选择列表)
    6. 每个项目的价格字段(因此,如果您有 3 扇门,每扇 3 英尺乘 5 英尺,每扇定价 2 美元,那么它可以将总成本计算为 6 美元(使用视图中的自定义字段)。

    然后确保在作业内容类型中它有一个节点关系字段,该字段可以包含无限项条目(内容类型)。这样您就可以添加任何您想要进行计算的项目。您可以使用视图快速构建报告、估算、页面等。您甚至可以为您的客户提供一个登录门户以查看估算值。

    查看 Drupal.org 和 drupalize.me。有大量精彩的视频、文章和资源可供您使用。此外,如果您能想到,那么有人可能已经编写了一个模块来执行此操作并在 Drupal.org 上免费列出以扩展您的网站。

    Drupal 将负责数据库模式。这可以让您腾出时间来构建 Web 应用程序。从 themeforest.net 获取一些出色的设计,我建议使用 Omega 960gs 基本主题来帮助您前进。

    【讨论】:

    • 感谢周到的回复,但不,谢谢。过去我曾在一个类似的项目中使用过 drupal,在花费了整整一年和几千美元试图将其弯曲到我的意愿之后,我决定从头开始并在 codeigniter 的帮助下构建应用程序。我不会回头。
    • 你一定有一些非常有趣的需求,它不适合你。我们已经使它适用于一些非常复杂的网站。尽管如此,学习使用 CodeIgniter 或其他框架(Zend 也非常强大)构建网站是一种有助于成为一名出色程序员的体验。学会用困难的方式做每一件事,当你学会了简单的方法时,你就会在大多数人不理解的水平上理解它。
    • 我继续发布了第二个答案,为您提供更多想法/帮助。我知道您已经选择了答案,但我仍然愿意提供帮助。
    【解决方案3】:

    MySQL 是大多数工作的标准工具。实际上,谷歌使用了他们称之为 BigTable 的高度修改版本,允许他们进行超快速搜索。对于这个项目,使用一些连接表。

    这是我推荐的。你有这些表:project、project_items、measurement_types、item_types

    项目表包含整个项目的项目名称、项目 ID 和任何其他有用的项目详细信息。

    project_items 表格列出了您在上面提供的所有订单项。它包含以下列:商品名称、商品描述、数量、重量、长度、宽度、高度、价格、measurement_type_id(参考measurement_types表)、item_type_id

    measurement_types 表包含测量类型的名称、描述(如果需要)、类型 ID(自动分配的主键)。该表既用于数据分类,也用于确定您从保存的测量值中使用的计算类型。这些计算(公式)可以保存在此表的另一列中,也可以直接放入您的代码中。

    item_types 表包含诸如排水沟、百叶窗、门、绝缘等物品的类型。您需要一个 id 列和一个 name 列。该表主要用于数据的分类。

    您使用它的方式是创建一个项目来关联所有项目,然后将项目添加到其中。每个项目都有其尺寸、名称、描述、数量、类型和价格。根据您选择的类型,您可以让 javascript 在输入表单上显示/隐藏正确的测量字段。然后,当您稍后进行计算时,您可以使用此类型来了解每个项目使用哪个公式。

    您还可以使用它生成一些好的报告。对于价格、商品明细等。

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2013-06-07
      • 1970-01-01
      • 2020-02-11
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多