网站匹配人员的数据库设计

3
我正在创建一个Facebook网络应用程序,类似于约会网站的功能,让用户提供有关自己和匹配用户偏好信息。
我正在创建数据库,并考虑以下设计:
- Members表:使用FB ID作为主键,包含有关用户的信息。 - Preferences表:包含用户想要的偏好信息。
大约会有20个字段可供用户指定偏好,但所有字段都是可选的。我不确定结构“preferences”表的最佳方法,目前有两种思路:
方案1:使用Facebook ID的外键,并为每个可以匹配的字段添加一个新列。问题在于如果某个字段没有指定值,则数据库中将会存在很多“null”值。
- 数据库中的“null”值会占据空间或引起其他问题吗?
方案2:再次使用Facebook ID的外键,但在接下来的两列中使用键值对方法。因此,一列将包含用户偏好的ID,另一列将包含其值。对于每个用户偏好,我将以以下结构记录:“用户ID”-“偏好ID”-“值”。
- 问题是“值”列中的类型将取决于“偏好ID”列的内容。
我的问题:
- 哪种方法更好? - 是否有标准的模式解决这种Web应用程序的问题?
1个回答

2

正如你所注意到的,无论哪种方式,你都需要做出妥协。你选择哪种方案取决于你的生产数据实际情况。

在稀疏表中,null值占用一点空间,但不是很多——只要你的列使用可变长度数据。10个null varchars并不长。10个null ints与10个non-null ints一样长。

如果你添加第三个表格"PreferableThings",并且以第二种解决方案中的"preference ID"为键进行索引,那么你拥有的就不是技术上的键值对或EAV(大多数人都避免)。如你所指出的困难在于,具有不同数据类型的首选项必须以通用编码形式(通常是varchar)存储。这解决了稀疏表的问题,但它强制你创建一些应用程序逻辑来从通用数据类型解码为正确的本机数据类型。你可以在"PreferableThings"表格上存储执行此操作的规则。

然而,第二种方法的另一个优点是,你可以通过表格驱动添加新的首选项选项。通过方案1,你需要进行模式更改。


非常有帮助的回复Joel - 我不知道我的第二个解决方案有一个名字!为什么要避免添加另一个表?我不知道如何在表中指定解码逻辑 - 在我的源代码中编写函数库来执行解码是否有问题?最后,您的最后一点是指在第一个解决方案中添加新首选项需要添加新列,但在第二个解决方案中只需要插入新行吗?再次感谢。 - user1058210
@user1058210 - 不是被敬而远之的是添加另一个表格。被敬而远之的是EAV(实体-属性-值)模型。有些人因为很容易使用不当而对它避之不及,而其他人则因为被灌输了“EAV就是邪恶”的观念而对其避之不及。解码逻辑需要内置于一个库函数中。通过在新/第三个表格中使用一个代码来驱动表格,告诉你的库函数所需的解码类型。关于最后一点,你说得对,那就是我的意思。 - Joel Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接