将异构对象存储在数据库中,使用Python将其取出

时间:2015-09-24 04:49:13

标签: python mysql sql database-design sqlalchemy

免责声明:爱好编码器乐趣学习。为任何可怕的行话错误道歉 - 请告诉我这些事情的正确名称,因为这真的有助于我自我教育的尝试。

我正在尝试使用Python和MySQL定义一个事物数据库(实际上是CloudSQL - 我在AppEngine上这样做)。这些东西是异构的 - 例如一些具有共同的属性,但许多具有独特的属性。我认为这可能是存储东西的合理方式:

table: things
|+++++++++++++|+++++++++++++++++|+++++++++++|
|  thing_id   |   property_id   |   value   |
|+++++++++++++|+++++++++++++++++|+++++++++++|
|      1      |        1        |    foo    |
|      1      |        2        |    blue   |
|      2      |        1        |    bar    |
|      2      |        3        |    large  |
|+++++++++++++|+++++++++++++++++|+++++++++++|

table: properties
|+++++++++++++++++|+++++++++++++++++++++++++|
|   property_id   |   property_definition   |
|+++++++++++++++++|+++++++++++++++++++++++++|
|        1        |    name                 |
|        2        |    color                |
|        3        |    size                 |
|+++++++++++++++++|+++++++++++++++++++++++++|

这样我的对象可以变化" width" - 有些人会有十个属性,有些会有一个名字 - 但我没有一个装满空列的大桌子。我很确定这是正确的做法。

令人困惑的一点是从我奇怪的嵌套表和Python中获取这些东西。我可以在概念上将每一行加载为具有可选属性的单个主类的实例化,但是我重新定义了我的所有属性及其定义,其中一些需要是可选的...它似乎不优雅必须两次定义所有内容。

我认为解决这个问题的方法是使用SQL炼金术,但是我无法理解这对于我的"深度与宽度"表结构。有人可以帮助我,即使我的上述例子有一些伪代码吗?我想拉出我的两个解构对象,重建它们并打印可用的属性 - 这对于每个对象来说都是重要的。

如果这没有意义,请告诉我,我会尝试重新发短语。抱歉,我认为这是一个非常基本的问题,我无法想象我是第一个遇到此问题的初学者;)

1 个答案:

答案 0 :(得分:1)

要以您描述的形式获取输出:

SELECT property_definition, value
FROM things
JOIN properties ON things.property_id = properties.property_id
WHERE thing_id = 8

方法是否良好,取决于应用程序。 如果你永远不会查询属性名称或值,我只是序列化为JSON并存储它。