数据库列的混合内容(float | | unicode)

2024-06-09 01:44:29 发布

您现在位置:Python中文网/ 问答频道 /正文

为了简单起见,假设我有一个问题。在

每个答案得一分。在

有些问题属于定性问题,因此用户必须在文本答案中进行选择。在

你最喜欢的宠物是什么?

  1. 类别[1分]
  2. 狗[2分]
  3. 凯门鳄[3分]

回答我得2分。在

有些问题定量,因此用户输入一个数字,然后使用线性插值进行评分:

你一天喝多少啤酒?

  1. 0[0分]
  2. 1[1分]
  3. 3[5分]

如果我回答2升我得到3分。在

现在,我使用sqlalchemy,并有一个表,其中每行都有一个答案:

questions
    id PK
    name String
    quantitative Bool

answers
    id Integer PK
    id_question Integer FK
    value String

每次我都要将answers.value转换为float,以便进行插值等等。在

  1. 我可以将列名value改为_value,并为{}生成getter和setter函数,每次转换为float answer._value,如果问题是数字(answer.question.quantitativeTrue

  2. 我可以用单独的列来回答文本和数值(比如value和{},反正我不会有几百万条记录)

  3. 或者。。。

什么东西应该更高效、更容易使用?在

请考虑一下SQLAlchemy magic,它可以处理很多肮脏的工作,我希望它保持简单。在


编辑

因为啤酒的例子可能会误导我,所以我结合另一个例子:

问:你在慈善事业中用美元捐了多少钱?

  1. 0[0分]
  2. 10[1分]
  3. 100分[2分]

就像pets&beer question我有答案值"0""10""100"作为字符串存储在数据库中的answers.value列中,这样就可以插入值来获得答案的分数50我有所有的时间将{}转换为float。在

在这里,我在同一个db列中混合了内容类型。在


Tags: 答案用户answer文本idstringvalue数字
2条回答

对于一个快速而肮脏的解决方案,我建议至少使用两个不同的列来存储不同的答案。您还可以向数据库添加CHECK约束,以确保其中一个用于任何行,另一个为NULL。然后使用quick-n-dirty代码计算总得分。在

另一种选择

其思想是建立适当的对象模型,将其映射到RDMBS中,这样就不需要问问题了。另外,我还希望在使用Single Table Inheritance时,生成的DB模式几乎与当前实现相同(当您使用选项echo=True运行脚本时,可以看到模型):

CREATE TABLE questions (
    id INTEGER NOT NULL, 
    text VARCHAR NOT NULL, 
    type VARCHAR(10) NOT NULL, 
    PRIMARY KEY (id)
)

CREATE TABLE answer_options (
    id INTEGER NOT NULL, 
    question_id INTEGER NOT NULL, 
    value INTEGER NOT NULL, 
    type VARCHAR(10) NOT NULL, 
    text VARCHAR, 
    input INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(question_id) REFERENCES questions (id)
)

CREATE TABLE answers (
    id INTEGER NOT NULL, 
    type VARCHAR(10) NOT NULL, 
    question_id INTEGER, 
    test_id INTEGER, 
    answer_option_id INTEGER, 
    answer_input INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(question_id) REFERENCES questions (id), 
    FOREIGN KEY(answer_option_id) REFERENCES answer_options (id), 
     FOREIGN KEY(test_id) REFERENCES tests (id)
)

下面的代码是一个完整的工作脚本,它显示了对象模型、它到数据库的映射以及使用场景。在设计时,该模型很容易扩展到其他类型的问题/答案,而不会对现有类产生任何影响。基本上,你得到更少的黑客和更灵活的代码,仅仅因为你有一个对象模型,正确地反映你的情况。代码如下:

^{pr2}$

我希望这个版本的代码能回答评论中提出的所有问题。在

使这一问题变得不必要复杂的是试图优化定量答案。在

这是多项选择。把定量的答案当作是定性的。把“点”作为每个答案的单独属性。在

是的,数据库中会有(“3升”,3)。是的,对一个有思想的人来说,这似乎是多余的。在

把定性和定量的答案完全分开来考虑,但要把它们完全排除在外。在


编辑。不要将答案存储为数字。这完全是错误的。在

Like for pets & beer question I have answer values "0", "10", "100" stored in database as strings in answers.value column.

正确。在

to interpolate values to get score for answer 50 I have all the time to cast answers.value to float.

不正确。在

像对待宠物一样去查他们。这是一个简单的连接。做任何事都要像对待宠物一样。将所有数据视为“定性”。一条简单的规则;不是两条规则。这是正确和标准的解决方案。在

相关问题 更多 >