我真的被购物车网站的数据库结构卡住了。我正在尝试创建一个用于学习目的的示例购物项目,但我陷入了困境。
这是我的示例数据库设计:
产品表:
id name description price productType ....
1 Sony Mobile Sony Mobile 15000 mobile
2 Sony TV Sony TV 35000 tv
3 LG WM LG WM 7500 Washing Machine
4 Levovo Lenovo Laptop 20000 Laptop
当用户搜索任何特定产品时,他还将获得根据不同而不同的过滤器选项productType
。
例如,如果用户正在搜索的产品是智能手机,那么他可用的过滤器应该是
price range: 1000 - 100000
Camera: 2px - 20px ..
Wifi: yes/no
Bluetoooth: yes/no
GPS: yes/no
..
如果产品是笔记本电脑,那么过滤器将与手机不同,即
price range: 15000 - 300000
Harddisk: 320GB - 2TB
RAM: 1GB - 64GB
OS: Linux
..
同样,过滤器将从washing machine
到不等TV
。问题是,这些过滤器应该存储在数据库中的什么位置。数据库的设计可能是什么?
另一个问题是,当用户像手机一样访问产品页面时,他会看到完整的手机详情。例如:
Size:
Battery:
images:
Removable battery:
...
我无法在上面的产品表中存储手机的所有这些详细信息,因为产品表不仅包含手机,还包含这些详细信息不匹配的其他类型的产品。例如,洗衣机不包含参数Removal battery
。因此,产品表中会生成一些不必要的列。
现在我很困惑,我应该将这个产品详细信息存储在数据库中的什么位置?
第一种方法是在产品表中创建一个列,将所有这些信息存储为 json 对象。
第二个可能是为每种产品类型动态生成表格,即所有手机的表格,所有笔记本电脑的表格等,其中应包含所有必要的字段。但是这个解决方案非常复杂,我试图避免它。
第三种是在为每种可能的产品类型编码时静态生成表格。在这里,问题是,假设将来,如果引入任何新产品类型,例如书籍,那么我将不得不在网站上线时在程序中编写代码。所以,这个解决方案是不灵活的。
那么,我该如何解决这两个问题,即过滤器和向用户显示产品的详细信息?
谢谢
你可以做的是这样的设计:
然后您将有可能过滤当前在您的数据库中使用的所有属性。
如果您希望能够过滤所有属性,即使它们目前未在任何产品中使用,您也必须添加一个表格
其中包含所有可能的属性,然后在 AttributesForProductType 和 ProductAttribute 之间设置参照完整性(外键)。这样您就可以避免在 ProductAttribute 表中拼错属性名称的风险。
编辑:如果你采用这种设计,这也解决了你的第二个问题:如何为每种可能的产品类型显示详细信息页面?
该产品的所有可能属性是
产品的所有真实属性及其价值
那些加在一起是(我的头脑,未经测试)