Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Mô hình dữ liệu ngày quan trọng

Bạn đang quên một cái gì đó? Mô hình dữ liệu giúp bạn ghi nhớ những ngày quan trọng - trước khi chúng xảy ra.

Bạn đã bao giờ quên một ngày quan trọng - sinh nhật của mẹ bạn hoặc ngày kỷ niệm của bạn? Hay bạn đang giảng bài? Yup, những điều như vậy xảy ra trong cuộc sống thực. Có thể không phải với tất cả chúng ta, nhưng với một số người trong chúng ta (bao gồm cả tôi), họ chắc chắn làm được. Để ngăn chặn những thảm họa như vậy, chúng tôi sẽ tạo một mô hình dữ liệu mà bạn có thể sử dụng làm nền cho một ứng dụng sẽ thông báo cho bạn đúng lúc.

Đã đến lúc phải nói lời tạm biệt với tất cả những gương mặt thất vọng và buồn bã đó cũng như những món quà không được mua đúng lúc. :)

Hãy đi sâu vào mô hình.

Mô hình dữ liệu

Mục tiêu của chúng tôi là tạo ra một mô hình dữ liệu cho một ứng dụng cho phép chúng tôi xác định các sự kiện trong tương lai và tất cả các hành động liên quan đến chúng. Ứng dụng phải thông báo cho người dùng khi họ làm một việc thực tế nào đó và đánh dấu việc đó là xong khi hoàn thành. Một số nhiệm vụ đang lặp lại, ví dụ:sự kiện đó sẽ kích hoạt sự kiện trong tương lai tại thời điểm mà chúng tôi đã xác định.

Tất nhiên, chúng tôi cũng sẽ cần phát triển các ứng dụng web và di động để làm cho hệ thống này thực sự hữu ích. Nhưng hiện tại, hãy tập trung vào mô hình dữ liệu.




Mô hình bao gồm ba lĩnh vực chủ đề:

  • User accounts & dates
  • Events & actions (definition)
  • Events & actions (real)

Chúng tôi sẽ mô tả từng lĩnh vực trong số ba lĩnh vực chủ đề này theo thứ tự mà chúng được liệt kê.

Phần 1:Ngày và Tài khoản Người dùng

Người dùng ứng dụng của chúng tôi có thể tạo hồ sơ người dùng của riêng họ và lưu trữ những ngày quan trọng mà họ lựa chọn. Để hỗ trợ điều đó, chúng tôi sẽ sử dụng các bảng sau.

user_account bảng có cấu trúc tương tự như cấu trúc được mô tả trong nhiều bài báo về mô hình dữ liệu, nhưng chúng ta hãy lặp lại nó một lần nữa. Đối với mỗi người dùng, chúng tôi sẽ lưu trữ:

  • first_namelast_name - Họ và tên của người dùng.
  • user_name - Tên người dùng đã chọn của người dùng.
  • password - Giá trị băm của mật khẩu mà người dùng đã chọn.
  • mobile - Số điện thoại di động do người dùng cung cấp.
  • email - Email được sử dụng trong quá trình đăng ký.
  • confirmation_code - Một mã xác nhận được gửi đến người dùng để hoàn tất đăng ký của họ.
  • confirmation_time - Khi người dùng hoàn tất quá trình xác nhận.
  • insert_ts - Dấu thời gian khi bản ghi này được chèn.

Sau khi đăng ký xong, người dùng sẽ có thể chọn những ngày quan trọng của riêng mình. Danh sách này được lưu trữ trong bảng select_date. Mặc dù chúng ta đang nói về ngày tháng, nhưng những gì người dùng thực sự đang chọn là các quy tắc sẽ biểu thị ngày tháng. Trước tiên, chúng tôi sẽ mô tả tất cả các thuộc tính trong bảng này, sau đó chúng tôi sẽ thảo luận về cách người dùng có thể đặt quy tắc bằng cách sử dụng các thuộc tính đó. Các thuộc tính là:

  • user_account_id - ID của người dùng đã chèn bản ghi này.
  • date_year , date_monthdate_day - Giá trị số nguyên đại diện cho các phần ngày (năm, tháng và ngày trong tháng).
  • date_weekday - Biểu diễn dạng văn bản của số thứ tự của ngày trong tuần. Chúng tôi đang sử dụng văn bản vì nó cho phép người dùng chọn các giá trị phức tạp hơn - họ có thể xác định cả ngày trong tuần và tuần trong tháng, ví dụ:Thứ Hai của tuần thứ hai mỗi tháng.

Xin lưu ý rằng tất cả bốn phần ngày có thể là NULL. Chúng tôi sẽ không cho phép các bản ghi có tất cả các giá trị NULL, vì vậy, chúng tôi sẽ kiểm tra theo chương trình để đảm bảo rằng ít nhất một phần ngày là KHÔNG ĐỦ.

Và bây giờ là một vài ví dụ:

  • Nếu chúng tôi muốn chọn một ngày chính xác, ví dụ:31.12.2018, chúng tôi sẽ đặt các giá trị thành date_year =2018, date_month =12 và date_day =31. Điều này xác định điều gì đó sẽ chỉ xảy ra một lần, vào ngày duy nhất đó.
  • Nếu chúng tôi sử dụng kết hợp date_year =2019 và date_month =1, để lại hai giá trị còn lại là NULL, sau đó chúng tôi sẽ xác định giá trị nào đó sẽ lặp lại trong cả tháng 1 năm 2019.
  • Sự kết hợp date_year =2019 và date_day =2 sẽ kích hoạt một sự kiện vào ngày thứ hai của mỗi tháng trong năm 2019.
  • Nếu chúng tôi chèn giá trị , chúng tôi đang xác định điều gì đó sẽ xảy ra vào thứ Hai của tuần thứ hai hàng tháng.

Phần 2:Sự kiện và Hành động (Định nghĩa)

Tôi đã đề cập đến một “cái gì đó” mơ hồ, nhưng một cái gì đó thực sự là một sự kiện. Sự kiện và hành động là lý do tại sao chúng tôi ở đây. Chúng tôi muốn liên hệ miền thời gian với các sự kiện và hành động thực tế sẽ xảy ra trong tương lai. Trong lĩnh vực chủ đề này, chúng tôi sẽ lưu trữ các định nghĩa cho tất cả các sự kiện và hành động. Các định nghĩa này sau này sẽ được sử dụng để tạo các sự kiện và hành động thực tế.

event bảng chắc chắn là bảng trung tâm trong lĩnh vực chủ đề này, nhưng trước khi mô tả nó, tôi muốn mô tả hai từ điển, event_catalogrecurrence_interval . Cả hai đều có cấu trúc giống nhau, với khóa chính tự động tăng dần (id ) và thuộc tính tên UNIQUE.

event_catalog từ điển sẽ lưu trữ các giá trị như “sinh nhật”, “ngày lễ”, “ngày kỷ niệm” và “khác”. Điều này sẽ giúp chúng tôi phân loại các sự kiện của mình.

Mặt khác, recurrence_interval sẽ lưu trữ các giá trị như “năm”, “tháng”, “tuần” và “ngày”. Giá trị này biểu thị đơn vị thời gian sẽ trôi qua trước khi sự kiện / hành động được giới thiệu lặp lại (nếu nó được xác định là sự kiện lặp lại). Khi khoảng thời gian đó trôi qua, một phiên bản mới của cùng một sự kiện / hành động sẽ được tạo.

Bây giờ chúng tôi đã sẵn sàng đi vào trọng tâm của lĩnh vực chủ đề này. Trong event bảng, người dùng xác định tất cả các sự kiện quan trọng đối với họ. Đối với mỗi sự kiện, chúng tôi sẽ lưu trữ:

  • selected_date_id - Tham khảo định nghĩa ngày tháng.
  • event_catalog_id - Biểu thị loại sự kiện.
  • description - Mô tả bằng văn bản bổ sung về sự kiện đó.
  • recurring - Một cờ biểu thị sự kiện có lặp lại hay không.
  • recurrence_interval_id - Xác định tần suất sự kiện lặp lại (năm, tháng, v.v.). Kết hợp định nghĩa ngày từ selected_date với khoảng thời gian lặp lại sẽ cho phép chúng tôi xác định điểm bắt đầu của sự kiện và có bao nhiêu sự kiện sau điểm bắt đầu đó sẽ được tạo tự động. Bằng cách này, chúng tôi có thể xác định điều gì đó như: “Bắt đầu từ ngày thứ Hai 2 hàng tháng (selected_date bảng), tự động lên lịch các cuộc họp hàng ngày (event.recurrence_interval thuộc tính) ” .
  • recurring_frequency - Một số biểu thị có bao nhiêu đơn vị (được định nghĩa bởi recurrence_interval_id ) phải vượt qua trước khi sự kiện này diễn ra lần nữa (nếu đó là sự kiện lặp lại). Đối với ví dụ trước (các cuộc họp hàng ngày), chúng tôi sẽ xác định giá trị này là 1.
  • recurring_times - Số lượng trường hợp của sự kiện này. Đối với ví dụ trước, đây sẽ là “5” (các cuộc họp hàng ngày từ thứ Hai đến thứ Sáu).

Tiếp theo, chúng tôi sẽ cần liên kết mọi người (được người dùng biết đến) với các sự kiện. Danh sách tất cả những người do người dùng của chúng tôi chèn được lưu trữ trong person bàn. Đối với mỗi người, người dùng sẽ xác định tên đầy đủ và mọi chi tiết bổ sung (nếu cần).

Giờ đây, những người này có thể liên quan đến các sự kiện của người dùng. Trong related_event bảng, chúng tôi sẽ lưu trữ các tham chiếu đến eventperson cũng như một số details về bản chất của mối quan hệ đó. Xin lưu ý rằng cùng một người có thể được thêm nhiều lần cho cùng một sự kiện. Điều này có thể có ý nghĩa nếu chúng tôi muốn lưu giữ nhiều bản ghi để chỉ ra điều gì đó đặc biệt (ví dụ:“mời Sofia đến bữa tiệc”; Sofia vừa là khách dự tiệc vừa là ca sĩ của ban nhạc tại bữa tiệc).

Hai bảng còn lại trong chủ đề này liên quan đến định nghĩa hành động.

Hành động có thể là bất cứ điều gì liên quan đến sự kiện. Ví dụ, nếu chúng ta muốn nhắc nhở bản thân về sinh nhật của mẹ, sẽ thật tuyệt nếu ứng dụng cho chúng ta biết:“Hãy bắt đầu suy nghĩ về món quà bạn muốn tặng mẹ”, “Mua quà cho sinh nhật mẹ”, “Tặng mẹ Quà tặng ngày B. Và một vài nụ hôn nữa ”và cuối cùng là“ Năm nay bạn lại làm thành công. Hoan hô cho bạn (và cho tôi)! ”

Được rồi, hãy nghiêm túc lại. Hành động là một tập hợp các văn bản được xác định trước sẽ thông báo cho người dùng khi nào cần làm điều gì đó. Chúng tôi sẽ có một từ điển với các loại hành động được xác định trước như “bắt đầu suy nghĩ”, “mua quà”, “tìm nhạc sĩ”, v.v. Danh sách tất cả các hành động DUY NHẤT như vậy được lưu trữ trong action_catalog bàn. Khi xác định một sự kiện, người dùng sẽ chọn một hoặc nhiều action liên quan đến sự kiện đó và xác định các giá trị sau cho từng sự kiện đó:

  • event_id - ID của sự kiện liên quan.
  • action_catalog_id - Giá trị đã chọn từ action_catalog từ điển.
  • description - Một mô tả tùy chọn của hành động đó. Mỗi khi hành động này được kích hoạt, ứng dụng của chúng tôi sẽ xem xét thuộc tính này, đọc các lệnh và thực hiện hành động đó.
  • action_code - Định nghĩa văn bản có cấu trúc về hành động đó.
  • starts_before - Xác định số lượng đơn vị thời gian đã chọn sẽ trôi qua trước khi bắt đầu hành động này cho sự kiện đã chọn (nếu đây là hành động lặp lại). Nếu giá trị này không được xác định (nghĩa là được đặt thành NULL), thì các hành động sẽ bắt đầu tại cùng thời điểm sự kiện bắt đầu.
  • send_message - Một lá cờ biểu thị liệu một tin nhắn có nên được gửi đến người dùng hay không.
  • recurring - Cho biết hành động này có lặp lại hay không.
  • recurring_interval_id - Biểu thị khoảng / đơn vị cho sự lặp lại (nếu đây là một hành động lặp lại).
  • recurring_frequency - Biểu thị số lượng đơn vị đã chọn phải trôi qua giữa hai lần lặp lại của cùng một hành động (nếu đây là một hành động lặp lại).
  • recurring_times - Chúng tôi sẽ tạo bao nhiêu trường hợp của hành động này?

Lặp lại hành động tuân theo cùng một mẫu với lặp lại sự kiện. Nếu hành động được xác định là lặp lại, chúng tôi sẽ tạo một phiên bản hành động mới sau khoảng thời gian đã xác định.

Phần 3:Sự kiện và Hành động (Thực tế)

Cho đến nay, chúng tôi đã tạo một mô hình dữ liệu cho phép chúng tôi chèn các sự kiện và xác định các hành động. Bây giờ chúng ta sẽ chuyển sang một phần thú vị hơn của mô hình:các sự kiện và hành động thực tế.

event_instance bảng chứa danh sách tất cả các sự kiện đã được tạo tự động hoặc được chèn thủ công. Mặc dù việc tạo tự động là khá rõ ràng - đó là lý do tại sao chúng tôi đã tạo ra mô hình này - chèn sự kiện thủ công cũng là một khả năng. Chúng tôi có thể mong đợi rằng một sự kiện sẽ được chèn tự động vào thời điểm đến hạn, vì vậy, chúng tôi thường chỉ có các sự kiện thực tế và quá khứ trong bảng này. Tuy nhiên, có thể xảy ra rằng chúng tôi đã quan tâm đến một số sự kiện trong tương lai, ví dụ:chúng tôi đã chuẩn bị cho một cuộc họp sẽ diễn ra vào tháng tới. Trong trường hợp đó, chúng ta có thể chèn thủ công một sự kiện trong tương lai (thời gian sự kiện được đề xuất theo các quy tắc đã xác định) và mọi thứ liên quan đến sự kiện đó vào bảng này. Mặt khác, ứng dụng của chúng tôi sẽ không ghi đè hoặc sao chép sự kiện đó. Nó sẽ nhận ra các sự kiện mà chúng tôi đã chèn bằng cách sử dụng event_time giá trị. Đối với mỗi trường hợp sự kiện, chúng tôi sẽ xác định:

  • event_id - Tham khảo event định nghĩa.
  • event_time - Thời gian sự kiện thực tế, ở định dạng văn bản có cấu trúc.
  • insert_ts - Dấu thời gian thực tế khi sự kiện này được chèn vào.
  • event_completed - Giá trị Boolean biểu thị sự kiện đã được hoàn thành hay chưa. Sự kiện tự động được đặt thành 'hoàn thành' nếu tất cả các hành động liên quan được hoàn thành. Người dùng cũng có thể đặt thủ công thành 'hoàn thành'.

event_id - event_time cặp là khóa thay thế / DUY NHẤT của bảng này.

Logic tương tự được sử dụng cho action_instance bàn. Các hành động cũng sẽ được tạo tự động khi chúng đến hạn. Nếu một hành động lặp lại, chúng tôi sẽ có nhiều hơn một hành động được xác định cho cùng một trường hợp sự kiện. Đối với mỗi hành động, chúng tôi sẽ xác định:

  • action_id - Tham khảo action .
  • event_instance_id - Tham khảo event_instance .
  • action_time - Thời gian thực tế của hành động, ở định dạng văn bản có cấu trúc.
  • insert_ts - Dấu thời gian thực tế khi sự kiện này được chèn vào.
  • action_completed - Giá trị Boolean biểu thị hành động đã được hoàn thành hay chưa. Người dùng đặt hành động thành 'hoàn thành' theo cách thủ công. Nếu trường hợp hành động được đặt thành "đã hoàn thành", thì trường hợp mới sẽ không được tạo (ngay cả khi định nghĩa cho biết chúng nên như vậy).

Trong bảng này, khóa thay thế / UNIQUE là sự kết hợp của action_id - event_instance_id - action_time .

Bảng cuối cùng trong mô hình của chúng tôi là message bàn. Nó được sử dụng để lưu trữ các thông báo do các hành động tạo ra. Những tin nhắn này được gửi đến người dùng. Đối với mỗi tin nhắn, chúng tôi sẽ lưu trữ:

  • action_instance_id - ID của action_instance đã tạo ra thông báo này.
  • message_title - Tiêu đề của tin nhắn.
  • message_text - Nội dung tin nhắn, trong đó có mô tả lý do tại sao tin nhắn này được tạo (tức là các trường văn bản từ các bảng có liên quan).
  • insert_ts - Dấu thời gian khi thông báo này được tạo.
  • message_read - Một cờ biểu thị người dùng đã đọc tin nhắn hay chưa.

Chia sẻ suy nghĩ của bạn về Mô hình dữ liệu sự kiện quan trọng

Tôi hy vọng bạn thích bài viết hôm nay. Bạn đã bao giờ quên về một ngày quan trọng? Bạn có nghĩ rằng mô hình này có thể giúp bạn? Vui lòng cho chúng tôi biết trong phần bình luận bên dưới.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt InfluxDB trên Ubuntu 20.10

  2. Hướng dẫn về các chức năng của PubNub

  3. Trình điều khiển ODBC của bạn có hỗ trợ nguồn dữ liệu người dùng không?

  4. Mô hình dữ liệu quản lý sự kiện

  5. Cách trừ 30 ngày cho một ngày trong T-SQL