【问题标题】:Database table design for situation dependent data情境相关数据的数据库表设计
【发布时间】:2015-01-06 07:20:30
【问题描述】:

假设您有一个表,其中包含非常依赖于情况的数据。

一个例子是玩家选择获胜的游戏集合。这个选择应该被存储,但是游戏是不同的,所以一个游戏中的选择并不真正适合另一个游戏中的选择。

一般来说,让表格足够宽以处理所有案例并为每个条目保留一些(但不同的)部分未使用会更好,还是应该为每个案例制作一个特殊的表格?

或者还有其他更好的技术吗?

【问题讨论】:

    标签: database postgresql database-design


    【解决方案1】:

    我不确定,如果我理解正确,您似乎需要一个 m:n 关系,这需要 3 个表:

    CREATE TABLE game
        (
        id int PRIMARY KEY,
        game nchar(x)
        )
    
    CREATE TABLE solution
        (
        id int PRIMARY KEY,
        solution nchar(x)
        )
    
    CREATE TABLE game_solution
        (
        id int PRIMARY KEY,
        id_game int NULL REFERENCES game( id),
        id_solution int NULL REFERENCES solution( id)
        )
    

    【讨论】:

    • 我的问题是:如果不同游戏的解决方案不一定适合 nchar 怎么办?也许一场比赛是多项选择,一场是多选,一场有两个答案等等。
    • @Lars:有多种方法: a) 由于不同的解决方案似乎是非结构化的,因此您取决于 RDBMS 提供的数据类型的大小; b) 另一种方法是将解决方案保存在文件中,并将文件的链接存储在表 [解决方案] 中。 c) 你也可以混合它,例如。 G。将较短的解决方案存储在表 [solution] 中,将较长的解决方案存储在文件中。但是,在 MS SQL VARBINARY(MAX) 中提供 2^31 - 1 个字节,这几乎是 2 GiB。我几乎无法想象需要更多存储空间的游戏解决方案!你能分享一下你是如何解决这个问题的吗?
    【解决方案2】:

    您的问题很笼统,所以简短的回答是:视情况而定!较长的一个是:如果您只有几款差异不大的游戏,“宽”牌桌是一个简单的解决方案。在某些情况下,我会采用该解决方案,但一般情况下不会。

    我的建议是:问问自己,所有选择/选择的共同点。该数据应该进入一个通用表。特定游戏的特殊数据应放在每个游戏的单独相关表中。

    不知道你作为程序员的背景如何。但如果您熟悉 OO 编程,只需 google 一下如何将类层次结构映射到 SQL 数据库的策略。

    【讨论】:

    • 所以按照我人为的例子,我应该制作一个带有“type_id”列的“answer”表。然后,加入一个适当的表,例如“answer_type_a”与“answer”?
    • 是的,例如。但是有 1001 个选项,这实际上取决于您的确切数据。如果答案表只有 type_id 列,那当然没有多大意义。根据您的查询要求和数据库引擎,您还可以使用 xml 或 json 列。 Postgresqls hstore 也可能是一种选择。
    【解决方案3】:

    @Lars:我刚刚重读了你的问题。

    为了简短:

    1. 如果您需要最大性能,请保持其完全结构化,即使您必须创建许多新表。

    2. 如果您需要灵活性,例如。 G。存储您还不知道结果结构的未来游戏的结果,而不考虑性能,存储二进制值或指向包含解决方案的文件的链接。

    3. 如果您需要灵活性并且更好的性能并且已经知道最常见的解决方案类型的结构,请将它们存储在结构化表格和所有其他不可预测的(未来)解决方案,作为二进制文件或文件链接。

    4. 如果您想保持简单,请使用第 1 点或第 2 点,因为第 3 点会增加您的程序的复杂性。

    我希望这是正确的答案。我很好奇,如果有人有更好的建议!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多