Database 将数据序列化到单个文本字段-反规范化走得太远了?

Database 将数据序列化到单个文本字段-反规范化走得太远了?,database,database-design,denormalization,Database,Database Design,Denormalization,我很想听听关于我目前所追求的数据库设计是否合理的意见 假设我正在构建一个名为“Home”的表,这个表有一个名为“rooms”的文本字段。此字段中是该房屋拥有的一组房间的序列化数据。当然,我的第一反应是将这些数据标准化到一个单独的“Rooms”表中。然而,由于过去对过度规范化数据库的一些令人沮丧的经历,我停下来问自己几个问题: 我需要找一个特定的房间吗 我是否需要更新单个房间 任何家庭记录都会共享房间记录吗 这些问题的答案都是“否”。每个家庭的房间记录都是独一无二的。例如,永远不需要执行查询来找出

我很想听听关于我目前所追求的数据库设计是否合理的意见

假设我正在构建一个名为“Home”的表,这个表有一个名为“rooms”的文本字段。此字段中是该房屋拥有的一组房间的序列化数据。当然,我的第一反应是将这些数据标准化到一个单独的“Rooms”表中。然而,由于过去对过度规范化数据库的一些令人沮丧的经历,我停下来问自己几个问题:

  • 我需要找一个特定的房间吗
  • 我是否需要更新单个房间
  • 任何家庭记录都会共享房间记录吗
  • 这些问题的答案都是“否”。每个家庭的房间记录都是独一无二的。例如,永远不需要执行查询来找出数据库中有多少家有浴室。数据总是从家庭的角度提取。卧室和浴室的数量将明确存储在家庭记录中以供搜索

    因此,我不必经常加入文件室,而是想知道序列化这些数据并将其弹出到文本字段会有什么害处


    这对我来说很有意义,但我希望能做一次精神检查。谢谢你的意见

    你说房间记录是独一无二的,但你不能强制执行。因此,在当前的设计中,您无法确定这一点:您的所有代码都应该完美地表示这一点


    “不断加入”并不是那么难做到,但如果是这样的话,你可以随时查看,然后你就完成了。

    好吧,你今天可能不需要查询来查找以下内容:

    • 俄亥俄州一个家庭的平均浴室数量是多少
    • 哪里有更多的卧室?东海岸还是西海岸
    • 房价和主卧的大小有什么关系?主卧面积增加30%的平均美元价值回报是多少
    等等等等

    如果你正确地设计你的基础,你将在未来处于一个更好的位置。不管这条捷径现在看起来多么诱人

    另外,使用单独的ROOMS表,您将能够添加以后有意义的其他ROOMS字段(如宽度/高度、颜色、楼层标高等),如果将数据整合到单个字段中,这将非常困难

    人们会希望以意外的方式进行查询,例如:

    • 我的膝盖不好。你能列出一楼有主卧和主卫生间的房子吗
    一般来说,拥有一个ROOMS表只会使您的应用程序更强大、更易于使用

    嘿,我明白你说的“过度规范化数据”。我们都去过那里,它确实很有用。然而,在包含住房信息的数据库中使用ROOMS表并不是“过度规范化”的。这只是以正确的方式构建应用程序。

    一个务实的答案

    • a) 您将来可能希望分解它的可能性
    • b) 现在不这样做的好处
    • c) 以后更改模式的成本

    如果
    a*c>b
    那么你现在应该分解了。

    除了其他人所说的做正确的事情之外,我想补充一点关于性能的评论


    由于您将在table Home中将序列化的文件室数据存储为一列,因此行大小将显著增加。这将导致所有其他查询的性能下降

    字符串类型的数据表示法听起来不太正确,不管是YSAGNI(像YAGNI一样,只有“假定”;)。您是否需要搜索至少有3间卧室的家庭?每个房间都有哪些数据?听起来,您似乎将房间数据视为其他应用程序的“二进制有效负载”,而不是自己使用。如果不是这样的话,我想知道你是否需要存储房间数据?@Martin-是的,但我明确地存储了家中卧室和浴室的数量record@Ronnis-这是典型的房地产产品。基本尺寸、房间名称、房间类型。此数据仅在主页的页面上显示。它本质上只是家庭的结构化元数据。它们是唯一的,因为它们对家庭来说是唯一的。即使它们被拉到一张单独的桌子上,我也无法阻止有人两次进入同一个房间。我假设一个唯一的房间是一个具有唯一功能(可以向房间桌子添加功能类型)或唯一名称的房间。您可以将2个“浴室”房间序列化为一个家庭,但不能使用唯一的家庭房间标识符键将2个“浴室”行添加到表中。另外,请看@martin的回答:我认为不规范化的好处是零……这绝对是一个考虑因素。然而,我想如果我们想把这个意思去掉,我总是可以抓取数据库的快照,然后编写一个小脚本,将其剥离到另一个表中。如果我们要做高级报告,这将由一个单独的应用程序来处理,而且无论如何也不会影响实时数据库。好吧,抓取数据快照并编写脚本只是为了查询主卧是否在一楼,这比一开始就正确设计应用程序要复杂得多,但听起来你可能已经下定决心了。看看这个页面上的其他评论,看看社区是怎么想的……我还没有下定决心,只是想弄清楚是否有性能原因不这么做。当您说“正确设计应用程序”时,我试图找出在给定需求的情况下这种方法在技术上不正确的地方。例如,将文本字段添加到包含数百万条记录的表中会比连接更糟糕吗?嗨,jmking-当然,保持数据分离是有性能原因的