【问题标题】:Better way to store operator and comparison value存储运算符和比较值的更好方法
【发布时间】:2013-12-13 16:27:09
【问题描述】:

我需要将运算符及其值存储到数据库中,因为之后,在循环中,我必须进行价格计算的比较。

这些值来自一个很少问问题的 HTML 表单,即:

问题:有多少项?
答案:<(选择选项) 10(文本框)

问题:什么时候?
答案:= (选择选项) 2013-12-13 (文本框)

将这两个值存储到包含多个问题的表字段中的最佳方法是什么?
使用 PHP 运算符和值进行序列化?
存储字符串< 10 或= 2013-12-13?

如果你知道更好的技术,请告诉我。

我的 MySQL 表是

CREATE TABLE answers(
    id         INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    answer_1     VARCHAR(50),
    answer_2     VARCHAR(50),
    answer_3     VARCHAR(50),
    ...
);

更新
我错过了帖子的重要部分,我更新了问题:我的表格作为多个答案字段。

【问题讨论】:

  • 两个字段。 operator 和 value。不要试图将它们粉碎成一个单一的领域。
  • 抱歉,我错过了帖子的重要部分(现已更新),我的表格作为多个答案字段,我无法为每个答案添加运算符和值字段。希望我已经解决了我的问题。
  • 存储数据的方式不仅在将数据添加到数据库时很重要,而且在何时以及如何使用它时也很重要。您将添加什么样的数据也非常重要。我的直觉反应是建议将它们存储为逗号分隔的字符串,以便您可以使用 PHP 的 explode 和 implode 来处理数据......但如果其中任何一个值可以包含逗号,这将不起作用.如果没有,您需要对数据进行清理以确保它没有那么好。
  • 感谢@Toote,您已确认我的解决方案。表单不是那么灵活——不同的字段、数据类型、没有对问题或答案的引用——据我所知,这是存储此类数据的一个很好的折衷方案。

标签: php mysql


【解决方案1】:

这听起来好像 mysql 数据库的设计违背了良好的 DBMS 设计原则。

如果您在某个表单中有已知问题,则不要将所有问题的答案都放入通用答案字段中。

您肯定希望将“小于/等于/etc”运算符存储在离散字段中,但您也希望将日期存储在日期字段中。和项目数量以适当的整数/数字表示。

根据您的问题,我没有足够的信息来了解您是否需要更复杂的数据结构(即问题表等),但根据您提供的信息,您可能需要更多类似的信息:

CREATE TABLE answers(
    id         INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    modItems    VARCHAR(4), // the greaterthan/lessthan for numItems
    numItems    INTEGER,
    modDate     VARCHAR(4), // the greaterthan/lessthan for dateDelivery,
    dateDelivery DATETIME   );

此外,查看您的用例,您可能希望更改生成数据的 Web 表单的结构。用户真的会说他们想要“少于 10 个项目”吗?我假设他们会知道(或估计)他们想要多少物品。如果您最终要根据项目数量为他们提供特殊处理/交易/等,只需让他们选择您最终将使用的项目范围,即填充有 1-9 个项目/10- 的选项列表50 项/ 51-100 项等。

【讨论】:

  • 你在一个好的 DBMS 设计中是对的,你的答案是一个很好的方法,但是表单不是那么灵活 - 不同的字段,数据类型 - 我只是想找到一个更好的妥协以尽可能更好地存储数据。感谢您的帮助。
【解决方案2】:

将它们分开 - 如果它更像这样,您的桌子会看起来/工作得更好:

CREATE TABLE answers(
    `id`         INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `answer_id`  INTEGER,
    `operator`   TEXT,
    `value`      TEXT,
    UNIQUE KEY `answer` (`id`,`answer_id`)
);

(当然,根据您的情况使用 NOT NULL/正确的列类型)

answer_id 必须在插入数据之前以编程方式确定,但您已经为列名 answer_1/etc 这样做了。

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 2021-01-11
    • 2012-10-17
    • 2018-05-27
    • 2023-03-26
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多