问题。我有一个可以有个别值或'包'值的项目。
e.g:
项目
Table Car
id INT
package_id INT
alloys BOOLEAN
aircon BOLLEAN
airbags TINYINT
transmission ENUM('auto','manual')
包裹:
Table Package
package_id INT
alloys BOOLEAN
aircon BOLLEAN
airbags TINYINT
transmission ENUM('auto','manual')
客户可以创建任何包(比此示例中的字段多15个),然后将其应用于任何汽车。它是一对多的关系(一个包可以应用于许多汽车)。但他们不必使用包裹。他们可以单独指定所有元素。现在我的问题是做什么更好?
package_id
中的Car
为NULL
,则使用来自Car的值Package
中的每一组更改存储在{{1}}中,即使它不是包本身而是自定义工作(如果它应该显示在包列表中,则添加一些is_package bool到确定)。提前致谢!
答案 0 :(得分:2)
如果我理解正确,你会描述一个简单的1:n
关系。我更喜欢第二种选择并将Car.package_id
设为NOT NULL
:
Table Car
---------
id INT PRIMARY KEY
package_id INT NOT NULL
FOREIGN KEY (package_id)
REFERENCES Package (package_id)
Table Package
-------------
package_id INT PRIMARY KEY
alloys BOOLEAN
aircon BOLLEAN
airbags TINYINT
transmission ENUM('auto','manual')
您仍然可以通过简单的查询找到哪些软件包是" custom" (仅用于一辆车)或许多汽车使用。
答案 1 :(得分:1)
基本上你有两种类型的汽车......定制汽车,以及来自包装的汽车。
这是一个可以使用继承来解决的问题。
当您为继承建模时,您有两个选择: - 创建包含所有属性的单个表 - 为每个孩子创建单独的表
他们都有自己的利弊,但基本上,将它们分成不同的表可以让你在其中一个孩子与不同的桌子相关时更好地保护你的数据完整性。
例如:当您在package_cars表中看到汽车时,您100%确定此汽车与某个包相关且不具有自己的属性。但是,如果使用单个表,则表更容易受到数据不一致的影响,因为您将依赖于“如果Car中的package_id为NULL然后使用Car中的值”这样的规则,并且只能在业务层中控制不在模特身上。
为了说明这一点,我们假设您添加了一个名为“类别”的表,规则是:“自定义汽车有一个类别。但是打包的汽车没有,因为该类别与包有关”如果您使用的是单个表你只需要在表中添加category_id,但现在你需要记住一个更复杂的规则:“如果package_id是NULL,那么使用来自Car的值和category_id不应该是NULL”。如果有人犯了错误(为什么不呢?)并在同一辆车上添加了category_id和package_id,那么你就会遇到数据不一致的情况。
简而言之,当孩子与其他表有不同的关系时,最好将它们分成不同的表以避免使用null-ables外键,它们可能会让人感到困惑和不一致。