Tôi đang phát triển một ứng dụng sẽ cần lưu trữ nội tuyến , intext siêu dữ liệu. Ý tôi là như sau: giả sử chúng ta có một văn bản dài và chúng ta muốn lưu trữ một số siêu dữ liệu được kết nối với một từ hoặc câu cụ thể của văn bản.
Điều gì sẽ là cách tốt nhất để lưu trữ thông tin này?
Suy nghĩ đầu tiên của tôi là đưa vào văn bản một số loại Markdown
cú pháp mà sau đó sẽ được phân tích cú pháp khi truy xuất. Một cái gì đó trông như thế này:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[@note this sounds really funny latin]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Điều này sẽ giới thiệu hai vấn đề tôi có thể nghĩ đến:
- Một điều tương đối nhỏ, là nếu cú pháp nói xảy ra tình cờ trên văn bản đã nói, nó có thể gây rối với phân tích cú pháp.
- Điều quan trọng nhất là điều này không duy trì siêu dữ liệu này tách biệt với chính văn bản.
Tôi muốn có một cấu trúc dữ liệu riêng biệt để chứa dữ liệu này, như một Bảng DB khác nhau trong đó các metadatas này được lưu trữ, để tôi có thể sử dụng chúng theo các cách riêng biệt: truy vấn, thống kê, sắp xếp, v.v.
EDIT: Vì người trả lời đã xóa câu trả lời của anh ấy, tôi nghĩ có thể tốt hơn khi thêm đề xuất của anh ấy vào đây, vì đó là một gợi ý khả thi được mở rộng trên khái niệm đầu tiên này. Các poster gợi ý để sử dụng một cú pháp tương tự, nhưng để liên kết các siêu dữ liệu cho PRIMARY KEY
các metadata
bảng cơ sở dữ liệu.
Một cái gì đó sẽ trông như thế này:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Trường hợp 15432
sẽ là ID
một hàng của bảng chứa thông tin cần thiết, có thể truy vấn, như ví dụ dưới đây.
Suy nghĩ thứ hai của tôi là lưu trữ thông tin loại này trong Bảng DB trông như thế này:
TABLE: metadata
ID TEXT_ID TYPE OFFSET_START OFFSET_END CONTENT
1 lipsum note 68 79 this sounds really funny latin
Theo cách này, siêu dữ liệu sẽ có một id duy nhất, text_id
như một khóa ngoại được kết nối với bảng lưu trữ văn bản và nó sẽ kết nối dữ liệu với chính văn bản bằng cách sử dụng phạm vi bù ký tự đơn giản .
Điều này sẽ thực hiện thủ thuật giữ dữ liệu tách biệt với siêu dữ liệu , nhưng một vấn đề mà tôi có thể thấy ngay với cách tiếp cận này là văn bản về cơ bản sẽ không thể chỉnh sửa được . Hoặc, nếu tôi muốn thực hiện chỉnh sửa văn bản sau khi gán siêu dữ liệu, về cơ bản tôi sẽ phải tính toán thêm các ký tự hoặc xóa so với phiên bản trước và kiểm tra xem mỗi sửa đổi này có thêm hoặc xóa các ký tự trước hay sau mỗi ký tự của siêu dữ liệu liên quan.
Mà, đối với tôi, nghe có vẻ như là một cách tiếp cận thực sự không phù hợp.
Bạn có bất kỳ gợi ý hoặc gợi ý cho cách tôi có thể tiếp cận vấn đề?
Chỉnh sửa 2: một số vấn đề về XML
Thêm một trường hợp khác sẽ khiến việc phân tách dữ liệu và siêu dữ liệu này xảy ra khá cần thiết.
- Giả sử tôi muốn làm cho những người dùng khác nhau có thể có các bộ siêu dữ liệu khác nhau của cùng một văn bản , có hoặc không có khả năng mỗi người dùng thực sự hiển thị siêu dữ liệu người dùng khác.
Bất kỳ giải pháp của markdown loại (hoặc HTML, hoặc XML) sẽ rất khó để thực hiện vào thời điểm này. Giải pháp duy nhất trong trường hợp này mà tôi có thể nghĩ đến là có một Bảng DB khác chứa phiên bản người dùng duy nhất của văn bản gốc, kết nối với bảng văn bản gốc bằng cách sử dụng a FOREIGN KEY
.
Không chắc chắn nếu điều này là rất thanh lịch.
- XML có một mô hình dữ liệu phân cấp: bất kỳ yếu tố nào nằm trong biên giới của một yếu tố khác đều được coi là con của nó , thường không phải là trường hợp trong mô hình dữ liệu mà tôi đang tìm kiếm; trong XML, bất kỳ phần tử con nào cũng phải được đóng trước khi có thể đóng thẻ cha , cho phép không có phần tử chồng lấp.
Thí dụ:
<note content="the beginning of the famous placeholder">
Lorem ipsum dolor ngồi<comment content="I like the sound of amet/elit">
amet</note>
, consectetuer adipiscing elit</comment>
,<note content="adversative?">
sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<note content="funny latin">
</note>
</note>
Ở đây chúng tôi có hai vấn đề khác nhau:
Các yếu tố khác nhau chồng chéo: Nhận xét đầu tiên bắt đầu trong ghi chú đầu tiên, nhưng kết thúc sau khi kết thúc ghi chú đầu tiên, tức là nó không phải là con của nó.
Các yếu tố giống nhau chồng chéo: Ghi chú cuối cùng và ghi chú in đậm; tuy nhiên, vì chúng là cùng một loại phần tử, trình phân tích cú pháp sẽ đóng phần tử được mở cuối cùng ở lần đóng đầu tiên và phần tử được mở đầu tiên ở lần đóng cuối cùng, trong trường hợp này, không phải là mục đích.