我在我的舊項目 中擁有此數據庫關係,其中運動設施具有用於預訂不同運動的字段。主要是足球;五個方面。 其中一些設施有我稱之爲複合材料領域。我們舉個例子吧。設施'4'有五人足球場;讓我們用數字1,2,3 2來識別它們。這些定位的方式是讓管理人員可以移除其中一個分隔符並將其中的兩個分隔符合併爲一個七邊或兩邊的字段併爲十邊形成一個字段。因此,現場4將1 + 2,現場5將2 + 3和現場6人1 + 2 + 3 這是SQL代碼,我有(這是寫在我的老項目PHP和MySQL)。使用複合鍵對GORM中的現有數據庫關係進行建模
CREATE TABLE IF NOT EXISTS field (
id INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
facility_id INT(5) UNSIGNED NOT NULL,
internal_id INT(3) UNSIGNED NOT NULL,
field_size VARCHAR(20) NOT NULL,
field_type VARCHAR(20) NOT NULL,
is_composite BOOLEAN NOT NULL DEFAULT FALSE,
display_name VARCHAR(20) NULL,
PRIMARY KEY (id),
UNIQUE (facility_id, internal_id),
CONSTRAINT fk_field_facility_id FOREIGN KEY (facility_id) REFERENCES facility(id)
ON UPDATE CASCADE ON DELETE CASCADE
)
;
INSERT INTO field (id, facility_id, internal_id, field_size, field_type, is_composite) VALUES
(4, 4, 1, 'FIVE_ASIDE', 'PLASTIC', false),
(5, 4, 2, 'FIVE_ASIDE', 'PLASTIC', false),
(6, 4, 3, 'FIVE_ASIDE', 'PLASTIC', false),
(7, 4, 4, 'SEVEN_ASIDE', 'PLASTIC', true),
(8, 4, 5, 'SEVEN_ASIDE', 'PLASTIC', true),
(9, 4, 6, 'TEN_ASIDE', 'PLASTIC', true)
;
CREATE TABLE IF NOT EXISTS field_component (
id INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
facility_id INT(5) UNSIGNED NOT NULL,
composite_internal_id INT(3) UNSIGNED NOT NULL,
child_internal_id INT(3) UNSIGNED NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY unq_facility_component_child (facility_id, composite_internal_id, child_internal_id),
CONSTRAINT fk_field_component_field_child FOREIGN KEY (facility_id, child_internal_id) REFERENCES field(facility_id, internal_id)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT fk_field_component_field_component FOREIGN KEY (facility_id, composite_internal_id) REFERENCES field(facility_id, internal_id)
ON UPDATE CASCADE ON DELETE CASCADE
)
;
INSERT INTO field_component (id, facility_id, composite_internal_id, child_internal_id) VALUES
(1, 4, 4, 1),
(2, 4, 4, 2),
(3, 4, 5, 2),
(4, 4, 5, 3),
(5, 4, 6, 1),
(6, 4, 6, 2),
(7, 4, 6, 3)
;
我試圖寫的Grails 3這個項目格姆學習的原因(我在我的新工作使用這些,而且如果可能的話我要重新創建的項目,並提供給一些人)。 正如你可以在這裏看到我在field_component所以父字段由現有油田字段引用兩個約束也讓孩子字段由現有油田字段引用和也屬於同一設施。所以有人不能添加一個字段作爲來自不同設施的組件。
在Grails中,我決定嘗試以編程方式創建域,並讓GORM創建數據庫(我實際上正在爲此苦苦掙扎,我總是傾向於從數據庫開始,讓它指導開發,但之後再也沒有使用過ORM )但我有問題重新創建這個約束。
我的表field_component基本上是一個連接表,所以我使用hasMany映射與joinTable,但問題是,通過使用ID的我不能強制第二個約束,確保子字段是的一部分同樣的設施。
這裏是我的Grails代碼
class Facility {
String name
static hasMany = [fields: Field]
static constraints = {
name unique: true, blank: false, maxSize: 30
}
}
class Field {
int internalId
FieldType fieldType
FieldSize fieldSize
boolean isComposite
static belongsTo = [facility: Facility]
static hasMany = [fieldComponents: Field]
static mapping = {
fieldComponents joinTable: [name : "field_component",
key : "composite_field_id",
column: "child_field_id"]
}
static constraints = {
internalId min: 1, unique: 'facility'
fieldType blank: false, defaultValue: FieldType.ARTIFICIAL
fieldSize blank: false, defaultValue: FieldSize.FIVE_A_SIDE
isComposite defaultValue: false
}
}
我想用一個組件id鍵(而不是默認的ID)的。 然後,我將有一個facility_id和INTERNAL_ID作爲主鍵,我想我可以參考的是,在joinTanble這樣的:
static mapping = {
fieldComponents joinTable: [name : "field_component",
key : "facility_id, internal_id",
column: "child_field_id"]
}
,但其實我不是100%肯定這會工作。 facility_id是按照慣例在數據庫中創建的,但我不確定GORM有多聰明。 即便如此,我仍然不確定我將如何執行關於屬於同一設施的字段的第二個約束。 這可能是我應該不打擾的,也是爲了獲益而付出的努力?我可以在添加和保存字段時進行一些驗證,但在數據庫方面它可能會導致錯誤的數據。
對此有何看法?