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

时间:2011-01-05 16:04:41

标签: database database-design denormalization

对于我目前追求的数据库设计是否健全,我会喜欢一些意见。

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

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

    因此,我不想不断地加入Rooms,而是想知道序列化这些数据并将其弹出到文本字段会有什么危害。

    这对我来说很有意义,但我希望能够进行理智检查。感谢您的任何意见!

4 个答案:

答案 0 :(得分:3)

好吧,您可能无需查询以查找以下内容:

  • 俄亥俄州一个家庭的平均浴室数量是多少?
  • 家里有更多卧室?东海岸或西海岸?
  • 房价如何与主卧室的大小相关?将主卧室面积增加30%的平均美元价值回报是多少?

等等。

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

另外,使用单独的ROOMS表,您将能够添加其他有意义的房间字段(如宽度/高度,颜色,楼层等),如果数据只是全球化的话,那将非常困难进入一个领域。

人们会想要以意想不到的方式进行查询,例如:

  • 我膝盖不好。你能列出一楼有主卧室和主浴室的房子吗?

通常,使用ROOMS表只会使您的应用程序更强大,更易于使用。

嘿,我得到你所说的“过度标准化的数据”。我们都去过那里,它咬了一口。但是,在具有住房信息的数据库中具有ROOMS表并未“过度标准化”。它只是以正确的方式构建应用程序。

答案 1 :(得分:3)

务实的答案......

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

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

答案 2 :(得分:1)

除了其他人所说的做正确的事情之外,我想补充一下关于表现的评论。

由于您将序列化的房间数据存储为表Home中的列,因此行大小将显着增加。这将导致所有其他查询的性能下降

答案 3 :(得分:0)

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

“不断加入”并不难做到,但如果确实如此,你总能为此制作一个视图,而且你已经完成了。