Không biết cách chuyển đổi thực thể biến thành bảng quan hệ


9

GIỚI THIỆU VÀ THÔNG TIN LIÊN QUAN:

Ví dụ sau minh họa vấn đề tôi gặp phải:

Động vật có một chủng tộc, có thể là một con mèo hoặc một con chó . Mèo có thể là Xiêm hoặc Ba Tư . Chó có thể là một người chăn cừu Đức hoặc Labrador retriver .

Động vật là một thực thể mạnh mẽ, trong khi chủng tộc của nó là một thuộc tính có thể có một trong hai giá trị được cung cấp (mèo hoặc chó). Cả hai giá trị này đều phức tạp (tôi chỉ thêm vào đây loại chó / mèo để minh họa vấn đề, nhưng cũng có thể có tên của mèo / chó và một loạt các thứ khác).

VẤN ĐỀ:

Tôi không biết cách tạo các bảng quan hệ cho ví dụ này.

HIỆU QUẢ CỦA TÔI ĐỂ GIẢI QUYẾT VẤN ĐỀ:

Tôi đã cố vẽ sơ đồ ER, sử dụng ký hiệu của Chen, đại diện cho vấn đề nhưng là người mới bắt đầu tôi không biết liệu mình đã làm đúng hay chưa. Đây là những gì tôi đã có:

nhập mô tả hình ảnh ở đây

Tôi xin lỗi nếu tôi vẽ một cái gì đó sai, xin vui lòng sửa cho tôi nếu đó là trường hợp. Tôi không muốn chỉ đơn giản là nhận "giải pháp miễn phí" mà còn học cách giải quyết vấn đề này để tôi có thể tự giải quyết nó trong tương lai.

Điều duy nhất nảy ra trong đầu tôi là tạo ra hai cái bàn riêng biệt, một cái cho mèo và một cái cho chó. Ngoài ra, thuộc tính chủng tộc trong bảng Động vật sẽ chỉ lưu trữ giá trị của mèo hoặc chó . Một cái gì đó như thế này:

Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >

Tôi thực sự có một cảm giác xấu về giải pháp của tôi và tôi sợ nó là sai, do đó câu hỏi dưới đây.

CÂU HỎI:

  • Làm thế nào tôi có thể chuyển đổi ví dụ của tôi thành sơ đồ ER?
  • Làm thế nào để chuyển đổi sơ đồ ER thành các bảng quan hệ?

Nếu cần thêm thông tin, hãy để lại nhận xét và tôi sẽ cập nhật bài viết của mình sớm nhất có thể. Cũng cảm thấy tự do để thêm các thẻ thích hợp vì tôi khá mới ở đây.

Cảm ơn bạn.


1
Việc chuyển đổi sơ đồ EER thành các bảng có thể được tìm thấy trong bài báo này từ năm 1986 của TJTeorey, D.Yang, JPFry: Phương pháp thiết kế logic cho cơ sở dữ liệu quan hệ bằng cách sử dụng mô hình quan hệ thực thể mở rộng . Nó là đơn giản và là một trong những giấy tờ yêu thích của tôi.
phép lạ173

Câu trả lời:


11

Cấu trúc phù hợp cho kịch bản này là mô hình SubClass / Thừa kế và gần giống với khái niệm tôi đề xuất trong câu trả lời này: Danh sách giá trị không đồng nhất theo thứ tự .

Mô hình được đề xuất trong câu hỏi này thực sự khá gần gũi ở chỗ Animalthực thể chứa loại (tức là race) và các thuộc tính phổ biến trên tất cả các loại. Tuy nhiên, có hai thay đổi nhỏ cần thiết:

  1. Xóa các trường Cat_ID và Dog_ID khỏi các thực thể tương ứng của chúng:

    Các khái niệm then chốt ở đây là tất cả mọi thứ là một Animal, không phân biệt race: Cat, Dog, Elephant, và vân vân. Cho rằng điểm bắt đầu, bất kỳ đặc biệt racecủa Animalkhông thực sự cần một định danh riêng biệt từ:

    1. sự Animal_IDđộc đáo
    2. các Cat, Dogvà bất kỳ thêm racecác đơn vị bổ sung trong tương lai không, bởi bản thân, đầy đủ đại diện cho bất kỳ đặc biệt Animal; chúng chỉ có ý nghĩa khi được sử dụng kết hợp với thông tin có trong thực thể mẹ , Animal.

    Do đó, Animal_IDbất động sản trong Cat, Dog, vv thực thể là cả PK và mặt sau FK đến Animalthực thể.

  2. Phân biệt giữa các loại breed:

    Chỉ vì hai thuộc tính có cùng tên không nhất thiết có nghĩa là các thuộc tính đó giống nhau, ngay cả khi tên giống nhau ngụ ý mối quan hệ như vậy. Trong trường hợp này, những gì bạn thực sự phải là thực sự CatBreedDogBreedlà "loại" riêng biệt

Ghi chú ban đầu

  1. SQL dành riêng cho Microsoft SQL Server (tức là T-SQL). Có nghĩa là, hãy cẩn thận về các kiểu dữ liệu vì chúng không giống nhau trên tất cả các RDBMS. Ví dụ, tôi đang sử dụng VARCHARnhưng nếu bạn cần lưu trữ bất cứ thứ gì bên ngoài bộ ASCII tiêu chuẩn, bạn thực sự nên sử dụng NVARCHAR.
  2. Các trường ID của các bảng "loại" ( Race, CatBreedDogBreed) không tự động tăng (nghĩa là IDENTITY theo T-SQL) vì chúng là các hằng số ứng dụng (nghĩa là chúng là một phần của ứng dụng) là các giá trị tra cứu tĩnh trong cơ sở dữ liệu và được biểu diễn dưới dạng enums trong C # (hoặc các ngôn ngữ khác). Nếu các giá trị được thêm vào, chúng được thêm vào trong các tình huống được kiểm soát. Tôi bảo lưu việc sử dụng các trường tăng tự động cho dữ liệu người dùng đi qua ứng dụng.
  3. Quy ước đặt tên tôi sử dụng là đặt tên cho mỗi bảng lớp con bắt đầu bằng tên lớp chính theo sau là tên lớp con. Điều này giúp tổ chức các bảng cũng như chỉ ra rõ ràng (không cần nhìn vào FK) mối quan hệ của bảng lớp con với bảng thực thể chính.
  4. Vui lòng xem phần "Chỉnh sửa cuối cùng" ở cuối để biết ghi chú về Lượt xem.

"Giống" là "Chủng tộc" - Cách tiếp cận cụ thể

Giống như sơ đồ đặc trưng chủng tộc
Nhóm bảng đầu tiên này là bảng tra cứu / loại:

CREATE TABLE Race
(
  RaceID INT NOT NULL PRIMARY KEY
  RaceName VARCHAR(50) NOT NULL
);

CREATE TABLE CatBreed
(
  CatBreedID INT NOT NULL PRIMARY KEY,
  BreedName VARCHAR(50),
  CatBreedAttribute1 INT,
  CatBreedAttribute2 VARCHAR(10)
  -- other "CatBreed"-specific properties as needed
);

CREATE TABLE DogBreed
(
  DogBreedID INT NOT NULL PRIMARY KEY,
  BreedName VARCHAR(50),
  DogBreedAttribute1 TINYINT
  -- other "DogBreed"-specific properties as needed
);

Danh sách thứ hai này là thực thể "Động vật" chính:

CREATE TABLE Animal
(
  AnimalID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  RaceID INT NOT NULL, -- FK to Race
  Name VARCHAR(50)
  -- other "Animal" properties that are shared across "Race" types
);

ALTER TABLE Animal
  ADD CONSTRAINT [FK_Animal_Race]
  FOREIGN KEY (RaceID)
  REFERENCES Race (RaceID);

Điều này thiết lập thứ ba của bảng là các thực thể sub-class miễn phí mà hoàn thành định nghĩa của mỗi Racecủa Animal:

CREATE TABLE AnimalCat
(
  AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
  CatBreedID INT NOT NULL, -- FK to CatBreed
  HairColor VARCHAR(50) NOT NULL
  -- other "Cat"-specific properties as needed
);

ALTER TABLE AnimalCat
  ADD CONSTRAINT [FK_AnimalCat_CatBreed]
  FOREIGN KEY (CatBreedID)
  REFERENCES CatBreed (CatBreedID);

ALTER TABLE AnimalCat
  ADD CONSTRAINT [FK_AnimalCat_Animal]
  FOREIGN KEY (AnimalID)
  REFERENCES Animal (AnimalID);


CREATE TABLE AnimalDog
(
  AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
  DogBreedID INT NOT NULL, -- FK to DogBreed
  HairColor VARCHAR(50) NOT NULL
  -- other "Dog"-specific properties as needed
);

ALTER TABLE AnimalDog
  ADD CONSTRAINT [FK_AnimalDog_DogBreed]
  FOREIGN KEY (DogBreedID)
  REFERENCES DogBreed (DogBreedID);

ALTER TABLE AnimalDog
  ADD CONSTRAINT [FK_AnimalDog_Animal]
  FOREIGN KEY (AnimalID)
  REFERENCES Animal (AnimalID);

Mô hình sử dụng breedloại chia sẻ được hiển thị sau phần "Ghi chú bổ sung".

Ghi chú bổ sung

  1. Khái niệm breeddường như là một tiêu điểm cho sự nhầm lẫn. Nó được đề xuất bởi jcolebrand (trong một bình luận về câu hỏi) đó breedlà một tài sản được chia sẻ trên các races khác nhau và hai câu trả lời khác đã được tích hợp như vậy trong các mô hình của họ. Tuy nhiên, đây là một lỗi vì các giá trị breedkhông được chia sẻ trên các giá trị khác nhau của race. Có, tôi biết rằng hai mô hình đề xuất khác cố gắng giải quyết vấn đề này bằng cách làm racecha mẹ của breed. Mặc dù về mặt kỹ thuật giải quyết được vấn đề về mối quan hệ, nó không giúp giải quyết câu hỏi mô hình hóa tổng thể về những việc cần làm đối với các thuộc tính không phổ biến cũng như cách xử lý một racevấn đề không có breed. Nhưng, trong trường hợp một tài sản như vậy được đảm bảo tồn tại trên tất cảAnimals, tôi cũng sẽ bao gồm một tùy chọn cho điều đó (bên dưới).
  2. Các mô hình được đề xuất bởi vijayp và DavidN (dường như giống hệt nhau) không hoạt động vì:
    1. Họ hoặc
      1. không cho phép các thuộc tính không phổ biến được lưu trữ (ít nhất là không cho các trường hợp riêng lẻ của bất kỳ Animal), hoặc
      2. yêu cầu tất cả các thuộc tính cho tất cả các races được lưu trữ trong Animalthực thể đó là một cách rất đơn giản (và gần như không liên quan) để biểu diễn dữ liệu này. Có, mọi người làm điều này mọi lúc, nhưng điều đó có nghĩa là có nhiều trường NULL trên mỗi hàng cho các thuộc tính không dành cho cụ thể đó racevà biết trường nào trên mỗi hàng được liên kết với cụ thể racecủa bản ghi đó.
    2. Họ không cho phép thêm một racesố Animaltrong tương lai mà không có breednhư một tài sản. Và thậm chí nếu TẤT CẢ Animals có một breed, điều đó sẽ không thay đổi cấu trúc do những gì trước đây đã được ghi nhận về breed: đó breedlà phụ thuộc vào race(tức là breedcho Catkhông phải là điều tương tự như breedcho Dog).

"Giống" như cách tiếp cận tài sản chung / / chung

nhập mô tả hình ảnh ở đây
Xin lưu ý:

  1. SQL bên dưới có thể được chạy trong cùng một cơ sở dữ liệu như mô hình được trình bày ở trên:

    1. Cái Racebàn giống nhau
    2. Cái Breedbàn mới
    3. Ba Animalbảng đã được thêm vào một2
  2. Ngay cả Breedkhi là một tài sản chung hiện nay, có vẻ như không được Racelưu ý trong thực thể chính / cha mẹ (ngay cả khi nó đúng về mặt kỹ thuật). Vì vậy, cả hai RaceIDBreedIDđược đại diện trong Animal2. Để ngăn chặn sự không phù hợp giữa RaceIDghi chú trong Animal2BreedIDkhác biệt RaceID, tôi đã thêm một FK trên cả hai RaceID, BreedIDtham chiếu CONSTRAINT ĐỘC ĐÁO của các trường đó trong Breedbảng. Tôi thường coi thường việc chỉ ra một FK cho một CONSTRAINT ĐỘC ĐÁO, nhưng đây là một trong số ít lý do hợp lệ để làm điều đó. CONSTRAINT ĐỘC ĐÁO là một "Khóa thay thế" một cách hợp lý, làm cho nó hợp lệ cho việc sử dụng này. Cũng xin lưu ý rằng Breedbảng vẫn có PK BreedID.
    1. Lý do không chỉ xảy ra với PK trên các trường kết hợp và không có CONSTRAINT UNIITE là vì nó sẽ cho phép BreedIDlặp lại cùng một giá trị khác nhau RaceID.
    2. Lý do không chuyển đổi PK và UNIQUE CONSTRAINT xung quanh là vì đây có thể không phải là cách sử dụng duy nhất BreedID, vì vậy vẫn có thể tham chiếu một giá trị cụ thể Breedmà không có RaceIDsẵn.
  3. Mặc dù mô hình sau không hoạt động, nó có hai lỗ hổng tiềm năng liên quan đến khái niệm chia sẻ Breed(và đó là lý do tại sao tôi thích các bảng đặc Racethù Breed).
    1. Có một giả định ngầm định rằng TẤT CẢ các giá trị Breedcó cùng thuộc tính. Không có cách dễ dàng nào trong mô hình này để có các thuộc tính khác nhau giữa Dog"giống" và Elephant"giống". Tuy nhiên, vẫn có một cách để làm điều này, được ghi chú trong phần "Chỉnh sửa cuối cùng".
    2. Không có cách nào để chia sẻ Breednhiều hơn một chủng tộc. Tôi không chắc chắn nếu điều đó là mong muốn để làm (hoặc có thể không phải trong khái niệm động vật nhưng có thể trong các tình huống khác sẽ sử dụng loại mô hình này), nhưng không thể ở đây.
CREATE TABLE Race
(
  RaceID INT NOT NULL PRIMARY KEY,
  RaceName VARCHAR(50) NOT NULL
);

CREATE TABLE Breed
(
  BreedID INT NOT NULL PRIMARY KEY,
  RaceID INT NOT NULL, -- FK to Race
  BreedName VARCHAR(50)
);

ALTER TABLE Breed
  ADD CONSTRAINT [UQ_Breed]
  UNIQUE (RaceID, BreedID);

ALTER TABLE Breed
  ADD CONSTRAINT [FK_Breed_Race]
  FOREIGN KEY (RaceID)
  REFERENCES Race (RaceID);

CREATE TABLE Animal2
(
  AnimalID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  RaceID INT NOT NULL, -- FK to Race, FK to Breed
  BreedID INT NOT NULL, -- FK to Breed
  Name VARCHAR(50)
  -- other properties common to all "Animal" types
);

ALTER TABLE Animal2
  ADD CONSTRAINT [FK_Animal2_Race]
  FOREIGN KEY (RaceID)
  REFERENCES Race (RaceID);

-- This FK points to the UNIQUE CONSTRAINT on Breed, _not_ to the PK!
ALTER TABLE Animal2
  ADD CONSTRAINT [FK_Animal2_Breed]
  FOREIGN KEY (RaceID, BreedID)
  REFERENCES Breed (RaceID, BreedID);


CREATE TABLE AnimalCat2
(
  AnimalID INT NOT NULL PRIMARY KEY, -- FK to Animal
  HairColor VARCHAR(50) NOT NULL
);

ALTER TABLE AnimalCat2
  ADD CONSTRAINT [FK_AnimalCat2_Animal2]
  FOREIGN KEY (AnimalID)
  REFERENCES Animal2 (AnimalID);

CREATE TABLE AnimalDog2
(
  AnimalID INT NOT NULL PRIMARY KEY,
  HairColor VARCHAR(50) NOT NULL
);

ALTER TABLE AnimalDog2
  ADD CONSTRAINT [FK_AnimalDog2_Animal2]
  FOREIGN KEY (AnimalID)
  REFERENCES Animal2 (AnimalID);


Chỉnh sửa cuối cùng (hy vọng ;-)

  1. Về khả năng (và khó khăn sau đó) xử lý các thuộc tính khác nhau giữa các loại Breed, nó có thể sử dụng các lớp con / thừa kế khái niệm tương tự nhưng với Breedlà thực thể chính. Trong thiết lập này, Breedbảng sẽ có các thuộc tính chung cho tất cả các loại Breed(giống như Animalbảng) và RaceIDsẽ đại diện cho loại Breed(giống như trong Animalbảng). Sau đó, bạn sẽ có các bảng lớp con như BreedCat, BreedDogv.v. Đối với các dự án nhỏ hơn, điều này có thể được coi là "kỹ thuật quá mức", nhưng nó đang được đề cập như là một lựa chọn cho các tình huống sẽ được hưởng lợi từ nó.
  2. Đối với cả hai cách tiếp cận, đôi khi nó giúp tạo Chế độ xem dưới dạng rút gọn cho các thực thể đầy đủ. Ví dụ: xem xét:

    CREATE VIEW Cats AS
       SELECT  an.AnimalID,
               an.RaceID,
               an.Name,
               -- other "Animal" properties that are shared across "Race" types
               cat.CatBreedID,
               cat.HairColor
               -- other "Cat"-specific properties as needed
       FROM    Animal an
       INNER JOIN  AnimalCat cat
               ON  cat.AnimalID = an.AnimalID
       -- maybe add in JOIN(s) and field(s) for "Race" and/or "Breed"
    
  3. Mặc dù không phải là một phần của các thực thể logic, nhưng điều khá phổ biến là có các trường kiểm toán trong các bảng để ít nhất có được ý nghĩa khi các bản ghi được chèn và cập nhật. Vì vậy, trong điều kiện thực tế:
    1. Một CreatedDatetrường sẽ được thêm vào Animalbảng. Trường này không cần thiết trong bất kỳ bảng lớp con nào (ví dụ AnimalCat) vì các hàng được chèn cho cả hai bảng phải được thực hiện cùng một lúc trong một giao dịch.
    2. Một LastModifiedDatetrường sẽ được thêm vào Animalbảng và tất cả các bảng lớp con. Trường này chỉ được cập nhật nếu bảng cụ thể đó được cập nhật: nếu một bản cập nhật xảy ra AnimalCatnhưng không có trong Animalmột cụ thể AnimalID, thì chỉ có LastModifiedDatetrường trong AnimalCatđó sẽ được đặt.

2
Bằng cách nào đó tôi có cảm giác bạn hiểu chính xác vấn đề của tôi là gì. Tôi sẽ cung cấp cho câu trả lời liên kết của bạn một cái nhìn, và nghiên cứu nó một cách cẩn thận. Chỉ cần một định nghĩa đơn giản về các bảng cũng sẽ rất tuyệt (nếu các truy vấn SQL quá nhiều để bạn viết vào lúc này). Nếu bạn quyết định cập nhật bài đăng của mình bằng các truy vấn SQL hoặc định nghĩa bảng, vui lòng để lại cho tôi một nhận xét. Cám ơn bạn một lần nữa. Trân trọng.
Luôn luôn học tập MớiStuff

1
Tôi đang cố gắng áp dụng câu trả lời của bạn cho trường hợp thực tế của tôi. Nếu tôi mù quáng làm theo hướng dẫn của bạn, tôi tin rằng tôi có thể bỏ lỡ cơ hội để tối ưu hóa hơn nữa thiết kế của mình. Tôi muốn bạn xem qua câu hỏi mới nhất của tôi vì bạn đã có thể hiểu hoàn hảo câu hỏi của tôi và đưa ra câu trả lời tuyệt vời. Tôi đã soạn câu hỏi để sử dụng mô hình dữ liệu chung chung để có ích cho người đọc trong tương lai. Nếu bạn gặp khó khăn trong việc tìm kiếm nó hãy để lại cho tôi một bình luận. Cảm ơn và xin lỗi vì đã làm phiền ...
Luôn luôn học tập MớiStuff

@AlwaysLearningNewStuff Xin chào. Nhận được tin nhắn này sớm hơn nhưng không có thời gian để nhận được nó ngay lập tức. Tôi đã có thể tìm thấy Câu hỏi mới bằng cách nhấp vào tên của bạn ở trên và nó hiển thị tất cả các Câu hỏi của bạn :-).
Solomon Rutzky

Tôi đã đề cập đến câu hỏi này . Tóm lại: Tôi có 3 thực thể với thuộc tính chung D, do đó tôi muốn áp dụng phương thức từ câu trả lời của bạn. Hai thực thể có thuộc tính chung Ekhông có trong thực thể thứ ba. Tôi có nên bỏ qua thực tế này và áp dụng giải pháp tiêu chuẩn, hoặc có cách nào để tối ưu hóa hơn nữa thiết kế của tôi không?
Luôn luôn học tập MớiStuff

4

Trước hết, bạn đang làm tốt để phân biệt giữa mô hình ER và mô hình quan hệ. Nhiều người mới không.

Dưới đây là một số từ thông dụng bạn có thể sử dụng để tra cứu các bài viết hữu ích trên web.

Trường hợp của bạn là một trường hợp cổ điển của lớp / lớp con hoặc, nếu bạn thích, gõ / kiểu con.

Cụm từ được sử dụng trong mô hình ER là "khái quát hóa / chuyên môn hóa". Và nhiều bài báo cho thấy điều này dưới mô hình EER (Tăng cường thực thể-Mối quan hệ). Đây không phải là trong bài trình bày ban đầu của Peter Chen về mô hình ER. Nó đã được thêm vào sau đó. Để có một bản tóm tắt khá tốt về gen / spec ở dạng pdf, bấm vào đây

Tiếp theo, khi chuyển đổi trường hợp lớp / lớp con sang mô hình hóa quan hệ, bạn thiết kế bảng. Có nhiều hơn một cách tiếp cận. Hai cách tiếp cận chính được gọi là kế thừa bảng đơn và kế thừa bảng lớp. Mỗi cái đều có ưu điểm và nhược điểm. Trình bày tốt nhất của hai thiết kế này đến từ Martin Fowler. Bạn có thể thấy phác thảo của mình ở đâyở đây .

Ưu điểm lớn của kế thừa bảng đơn là sự đơn giản. Tất cả được lưu trữ trong một bảng. Hạn chế lớn là rất nhiều NULLS. Điều này có thể lãng phí không gian và thời gian và dẫn đến logic khó hiểu.

Kế thừa bảng lớp yêu cầu tham gia, nhưng chúng đơn giản và nhanh chóng. Đặc biệt nếu bạn sử dụng một kỹ thuật gọi là khóa chính được chia sẻ, trong đó PK trong các bảng lớp con là bản sao của PK trong bảng siêu lớp. Bạn có thể tạo các khung nhìn cho từng lớp con tham gia dữ liệu siêu lớp với dữ liệu của lớp con.

Cuối cùng, có một thẻ trong lĩnh vực này thu thập các câu hỏi như của bạn với nhau.
Ở đây nó là:


1
+1 Điều khiến tôi bối rối là việc thiếu các khóa chính trong sơ đồ bảng. Đặc biệt là trong "classTableInherribution" tôi không thể thấy rằng tất cả các bảng này được kết nối bởi cùng một khóa chính.
phép lạ173

@ miracle173 một điểm hợp lệ. Vì một số lý do, Fowler không bao gồm các PK và FK trong sơ đồ. Có các bài viết khác theo kế thừa bảng lớp cung cấp chi tiết này. Không phải tất cả các triển khai kế thừa bảng lớp kết hợp nó với khóa chính được chia sẻ. Tôi khuyến khích điều đó. Đó là một công việc nhiều hơn vào thời gian chèn, nhưng dễ dàng hơn và nhanh hơn tại thời gian truy xuất đã tham gia.
Walter Mitty

3

Tôi thấy trên thiết kế có thể là

Bàn Race

RaceId- PK- Int
RaceName - Varchar(50)

Bàn Breed

BreedId - PK- Int
RaceId - FK - Int
BreedName - varchar(50)

Bàn Animal

AnimalId - PK- Int
BreedId - FK - Int
Other Columns....

Các PK ở trên sẽ là cột tăng tự động. Các cột khác trong Animalbảng có thể được đặt tên tương ứng.

nhập mô tả hình ảnh ở đây


Ngoài ra, tôi sẽ thêm các trường có khóa Race và Type (có thể là trình kích hoạt) trong bảng Animal để tạo điều kiện cho các chỉ mục sau này cải thiện tốc độ.
Felipe Alcacibar

0

Phương pháp hiện tại của bạn không tệ. Tuy nhiên, nếu bạn sẽ thêm nhiều chủng tộc sau này (chim, cá, v.v.) thì việc tạo một bảng riêng cho mỗi chủng tộc có thể rất cồng kềnh. Tôi muốn giới thiệu một cái gì đó như sau:

Animal < # Animal_ID, Breed_ID, other attributes >
Breed < # Breed_ID, Race_ID >
Race < # Race_ID >

Một giống chó, theo hiểu biết của tôi, chỉ nên có một chủng tộc. Vì vậy, nếu bạn lưu trữ giống trong bảng Động vật, bạn sẽ có thể xác định chủng tộc bằng cách tham gia vào bảng Giống. Rõ ràng, thêm bất kỳ thuộc tính nào khác (tên, mô tả, v.v.) vào bảng Breed và Race khi cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.