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

标签 php mysql database cakephp

原始帖子已基本解决,请检查编辑 #2 以了解我最近的问题

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

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

我一直在研究改进数据结构的方法,以便当我有很多条目时,可以轻松地将它们塑造为我需要的内容。我将使用这些数据为用户生成图形和图表,但这是不相关的。

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

我目前的结构是这样的。

我的 table

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

我有这些 table 同事。因此,药物是下拉列表中提供的所有可用药物的列表,记录表是他们可以存储剂量和单位以及其他一些杂项内容的地方,以及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. “标题”字段将是用户可以选择输入的标题(如果他们想要为条目添加标题)。格式正确吗?

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

我感谢任何人花时间阅读本文。当然,我并不指望我的问题能得到完整的解决方案。但即使您只能针对我的问题的一部分提供提示或意见,这也会对我有很大帮助。

最佳答案

关于您的第一个问题,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
       )
   )
)
<小时/>

好书

关于php - 我的数据库的高级组织,需要提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17161472/

相关文章:

php - mysql 查询没有收到任何结果

php - 如何在 Laravel 中使用归一化更新多个图像

mysql - 具有第三个时间维度的数据库结构

mysql - 解析MySQL中的日期

java - sql表结构来存储html选择数据

Sublime Text 3 的 PHPCS 插件给出 WinError 2

javascript - 单击我的提交按钮时自动滚动

mysql - 排除列值上的连接记录?

mysql - 如何将权限 "LOAD FROM INFILE"添加到我的数据库?

database - Redis 适合我需要的东西吗