高级组织我的数据库,需要提示

时间:2013-06-18 05:55:21

标签: php mysql database cakephp

原帖大部分都已解决,请查看编辑#2了解我最近的问题

我希望你们很容易理解我想要做的事情。我正在开发一个带有cakePHP的项目,它允许用户记录药物使用情况。无论是酒精,咖啡因还是其他任何东西。当人们添加日志时,他们从下拉列表中选择物质,然后输入他们拍摄的数量,然后输入他们选择用于测量的单位。

例如,有人可以从下拉菜单中选择酒精,然后输入12作为剂量,然后输入mL作为单位。

我一直在研究改进数据结构的方法,这样当我有很多东西时,很容易将它们塑造成我需要的东西。我将使用这些数据为用户生成图形和图表,但这是未发布的。

我需要帮助找出组织这些数据的最佳方法

我目前的结构是这样的。

我的桌子

drugs
id | drug
1  |  Alcohol

records
id | dose | unit | user_id
2  |  12  |  mL  |   3 

record_drugs
id | record_id | drug_id
4  |     2     |    1

我有这些表伙伴关系。所以药物是下拉列表中提供的所有可用药物的列表,记录表是他们可以存储剂量和单位以及其他一些杂项的地方,以及 record_drugs 基本上将记录与药物配对。

我遇到的一些问题:

1 即可。让我们说使用有多个酒精记录,我做了一个小脚本,添加所有酒精剂量,然后向他们显示他们记录的酒精总量。如果我做一个简单的查找(列表),我可以获得药物名称,以及剂量的总量,但是我不能得到与药物相关的单位。因为看起来foreach语句只支持传递两个变量。

编辑:更多信息 我的发现非常复杂,但它的作用是通过我上面列出的三个表并抓取3个字段。它在数组

中显示如下
array(
'mL' => array(
    'Alcohol' => '12'
),

然后,在我看来,我尝试将这些结果循环到foreach中以显示我的数据。

Alcohol: 12 ml

我知道如何格式化它并回显变量我只是不知道如何抓取我需要的数组中的三个值,然后将它们放入回声中。

2 即可。如果我想配对许多类似的药物怎么办?例如,如果我将啤酒,威士忌,朗姆酒添加到列表中。所有这些都属于同一个“类别”,我想将这些类别用于某些功能。


我一直在考虑的解决方案是将单位作为另一个下拉菜单的一部分。然后只有一个单位与药物相关联。所以我可能会将我的药物表改为

drugs
id | drug | unit
1  |Alcohol| mL

但是,这为用户设置单元留下了自定义空间。也许他想要用啤酒来衡量,也许他想用镜头来衡量。


编辑#2


我一直在努力规范我的数据库,这是最终的布局

records
id | date | title | user_id
1  | Jan  | Title | 1

units
id | unit
1  | mL
2  | l

drugs
id | drug
1  | Alcohol

record_drugs
record_id | drug_id | unit_id | dose
1         | 1       | 2       | 5

//There is a users table, but it is unrelated, and correctly formatted.

几个问题;

  1. 对于上面的前三个表,对于id字段。我应该将其命名为“tablename_id”还是“id”?

  2. 'title'字段将是用户可以选择输入的标题,如果他们想要在那里标题。它的形式是否正确?

  3. 单位相对价值如何运作?

  4. 我感谢任何花时间阅读此内容的人。当然,我不希望我的问题只能交给我一个完整的解决方案。但即使你能就我的问题的一部分提供小费或意见,这对我也有很大帮助。

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,foreach只能迭代一个关联数组中的一个键和一个关联值,但是这可以扩展为迭代查询结果。假定查询返回一个列和值数组,您可以使用foreach对其进行迭代,然后从列数组中访问每个列名。

$resultFromQuery = array(
    array(
        'columnOne' => 'valueOne',
        'columnTwo' => 'valueTwo'
    ),
    array(
        'columnOne' => 'valueThree',
        'columnTwo' => 'valueFour'
    )
);

然后当你迭代它时:

foreach($resultFromQuery as $result) {
    echo "From this result...\n";
    echo "columnOne: " . $result['columnOne'] . "\n";
    echo "columnTwo: " . $result['columnTwo'] . "\n";
}

您的第二个问题完全取决于这些类别需要的功能类型。您可以为类别创建一个表,并为每种药物的类别存储一对一的外键:

Categories
----------
id INT (primary)  <------+
name VARCHAR(255)        |
                         |
Drugs                    |
-----                    |
id INT (primary)         |
name VARCHAR(255)        |
category_id INT (fk) ----+

另外,我建议您将规范化更多,以将单位抽象到自己的表中。这样,您可以存储单位金额(相对于基本单位)并即时执行转换。

units
---------
Id INT AUTO_INCREMENT (primary index)
UnitName VARCHAR(255) NOT NULL (unique index)
UnitRelativeValue DECIMAL NOT NULL

鉴于此结构,单位也有一个id,因此您可以存储用户每种药物的首选单位。

UserDefaultDrugUnit
---------------------
id (primary key)
user_id (foreign key)
drug_id (foreign key)
unit_id (foreign key)

此架构还允许回退到具有类似结构的名为DefaultDrugUnit的表中的每种药物的系统默认值。


编辑(响应您对问题1的编辑)

要遍历多维数组,您需要使用嵌套的foreach循环:

$units = array(
    'mL' => array(
        'Alcohol' => '12'
    )
);

foreach($units as $unit => $drugs) {
    foreach($drugs as $drug => $amount) {
        echo $drug . ' ' . $amount . ' ' . $unit . "\n";
    }
}

Codepad Demo

虽然,我不确定我是否遵循此层次结构中的逻辑。对我来说,这样的事情会更有意义:

array(
   'Alcohol' => array(
       'amount' => 12,
       'unit' => array(
           'name' => 'mL',
           'relativeQuantity' => 0.001 // ml in L
       )
   )
)

好读